2014-04-30 4 views
2

나는 1000 개 이상의 커브를 플롯하고 gnuplot으로 아이 다이어그램을 표시하고 싶습니다. MATLAB 눈 다이어그램 예의gnuplot으로 아이 다이어그램 만들기

예 : http://www.mathworks.fr/fr/help/comm/ref/commscope.eyediagram.html

이미 노호 스크립트를 사용하여 곡선을 그릴 수

gnuplot> plot for [col=1:1000] 'input_dataset1.txt' using 0:col with lines linecolor rgb("#0000ff") 

결과 : output_image.png 내 문제는 두 개의 라인과 교차 할 때, 교차점은 선과 같은 색을 갖습니다. 아이 다이어그램에는 다른 색상의 교차점이 많은 영역이 표시되어야합니다.

gnuplot으로 만든 그러한 다이어그램의 예는 없습니다.

투명도로 재생하지 못했습니다. 두 개의 반투명 선의 교차점은 선과 같은 색입니다.

아이디어가 있으십니까? 나는이 작업을 수행 할 수있는의 gnuplot-유일한 방법을 일

+0

당신이 당신의 데이터를 2D 플롯을 원하십니까 : 각 방향을 따라 2 배의 해상도, 아래처럼 같은 모습으로? 그렇다면'splot' 명령이나'plot 'data.txt'matrix with image '를 살펴보십시오. 아이 다이어그램은 2D 플롯의 특정 용도와 비슷하기 때문에 묻습니다. – andyras

+0

이렇게하려면 외부 도구로 막대 그래프를 만들어야합니다 (예 : [txt 파일에서 heatmap2d를 생성하십시오] (http://stackoverflow.com/questions/18526485/create-heatmap2d-from-txt-file). – Christoph

답변

1

덕분에, 그것은 약간의 작업을 포함하고 당신은 아마 미세 조정에 특정 문제에 대한 세부 사항을해야합니다.

예로서 I 3 ( T^(3)[exp(x)] = 1 + x + x**2/2. + x**3/6.)를 주문하는 기능 exp(x) 순서 0에서의 테일러 확장 ( T^(0)[exp(x)] = 1) 값을 포함하는 데이터 파일을 생성. 이러한 종류의 데이터는 원점 주변에서 높은 데이터 밀도를 가지므로 모든 근사값이 정확한 값으로 수렴되고 데이터 밀도가 떨어져서 발생하므로이 문제에 적합합니다. 의 gnuplot과 같이 생성 할 수 있습니다 : 서로 다른 빈 줄 데이터 블록으로 구분 된 필드를 처리 달리의 gnuplot,

set xrange [0:1] 
set table 
set output "| grep -v '^$' > data" 
plot exp(x), 1, 1+x, 1+x+x**2/2., 1+x+x**2/2.+x**3/6. 
unset table ; unset output 

참고 나는 출력이 나의 데이터 파일이 빈 줄이없는 서식하고있어이 결국 망쳐 놨어요 아래의 히스토그램. 이 데이터는이 (plot "data")과 같습니다

enter image description here

을 지금, 나는이 데이터를 2 차원 막대 그래프를 만들 수 있습니다. gnuplot이이 기능을 제공했다면 매우 도움이 될 것입니다.하지만 그렇게하지 않으면 작업이 약간 까다로워집니다. 내가 할 일은 여러 1D 히스토그램을 만드는 것입니다. 후자를 생성하는 방법에 대한 자세한 내용은 this을 확인하십시오.

우선 각 요소 xwidth을 측정하는 경우 데이터 포인트의 수는 우리가 그리드에 데이터 공간을 분할, 즉, 계산됩니다 귀하의 쓰레기통, xwidthywidth에 대한 xy 함께 폭을 파악하는 것입니다 ywidth에 의해 포함되며 내부에 포함 된 데이터 요소의 수와 동일한 숫자가 지정됩니다. 이러한 요소가 작을수록 그래프의 해상도는 좋아 지지만보기 좋게하려면 더 많은 데이터 요소가 필요합니다.

bin(x,width)=width*floor(x/width)+width/2.0 

각 방향을 따라 빈의 수를 정의 : 위의 내 데이터의 경우,이

xwidth = 0.02 
ywidth = 0.05 

같은 것을 이제 우리는 우리의 1D 쓰레기통 (details)를 정의하는 함수를 선언 할 수 있습니다.내 데이터의 xrange[0:1]이고 내 yrange은 [1 : 2.8]이므로 빈의 수는 각각 50과 36이됩니다. Nx = xrange/xwidth을 사용할 수는 있지만 float가 Nx이되고 정수가 필요합니다. 안전을 위해 내가 할 : 그것은 다른 방법으로 주위에이 값을 정의하는 것이 더 적합 할 수 있습니다

Nx = 50 
Ny = 36 

가 : 당신이 정수/부동 소수점 문제가 안되는 경우 xrange/Nxxwidth을 계산합니다.

는 이제 x 값 위에 루핑 y 따라 1D 히스토그램 생성 :
set output "| grep -v 'u\\|^$' | sed 's/#/\\n#/g' > data2" 
set table 
plot for [i=0:(Nx-1)] "./data" using \ 
(bin($2,ywidth)):(i*xwidth <= $1 && (i+1.)*xwidth > $1 ? 1.0 : 0.0) \ 
smooth freq 
unset table ; unset output 

지금 data2 그들 각각 Ny 데이터 포인트 y 따라 주사되고, 데이터의 Nx 블록을 포함한다. 이 데이터 포인트의 값은 원래 data 파일의 데이터 항목 수입니다. 즉, data2에는 2D 데이터 ( y, color)가 포함되어 있으며 3D로 다시 매핑해야합니다. x 값은 데이터 블록 위치에 의해 부여되며, gnuplot에서 every 옵션으로 액세스 할 수 있습니다. 플롯이 3 차원 내가 할 :

plot "./data3" with image 

다음과 같습니다 :

enter image description here

가 I을했다

set output "| grep -v 'u\\|^$' | sed 's/#/\\n#/g' > data3" 
set table 
splot for [i=0:(Nx-1)] "./data2" every :::i::i using \ 
((i+0.5)*xwidth):1:2 
unset table ; unset output 

data3 이제 컬러 맵으로 그릴 수 있습니다 고화질의 데이터를 사용하여 그래프가 더 멋지게 보입니다.

enter image description here

관련 문제