2

次のグラフは gnuplot で生成されます。ここに画像の説明を入力

5 つの波が表示されます (ただし、それより多い場合も少ない場合もあります)。ただし、必要なのは、次のように各波を個別に表示することです (私は gimp で行いました):

ここに画像の説明を入力

gnuplot でこれを行う方法はありますか? また、現在のように、各波を異なる色にする必要があります。

使用した gnuplot スクリプトは次のとおりです: http://pastebin.com/vAD2syTS

これは、gnuplot スクリプトがデータを修正するために使用する python スクリプトです: http://pastebin.com/WEncNjDA

ここにデータがあります: http://pastebin.com/ewBpvHWM

Pythonスクリプトが修正した後のデータは次のとおりです:http://pastebin.com/cgimMyr9

4

2 に答える 2

6

私はこれでいくつかの楽しみを持っていました。私の戦略は、境界線を揃えるために、最初、最後、および中間のプロットをわずかに異なる設定でプロットすることです。また、プロットするデータ セットが 1,600 万以下に達しない限り、すべてのプロットの色が確実に異なるように、いくつかの関数を定義します。

### indices: change this parameter to equal the number of data sets to be plotted
indices = 8 
# h: height of output in pixels
h = 150.0*indices
# d: top and bottom margin in pixels
d = 75.0

### define functions to help set top/bottom margins
top(i,n,h,d) = 1.0 - (d+(h-2*d)*(i-1)/n)/h
bot(i,n,h,d) = 1.0 - (d+(h-2*d)*i/n)/h

### define some fun RGB code converter functions

# round: crude rounding function (gnuplot doesn't have this?)
# assumes a float, returns an int
round(x) = x-int(x)>=0.5?ceil(x):floor(x)

# i2h: converts a (decimal) integer between 0 and 15 to hex.
# returns a string, 0-F corresponding to 0-15
i2h(i) = i==10?'A':i==11?'B':i==12?'C':i==13?'D':i==14?'E':i==15?'F':sprintf('%d',i)

# i2r: converts an integer to an RGB code.
# returns a string (RGB code) of length 6, 000000-FFFFFF corresponding to 0-16777215
# changing the last division to 15 instead of 16 prevents colors being too faint
i2r5(i) = i2h(i/(15**5))
i2r4(i) = i2h(i%(16**5)/(15**4))
i2r3(i) = i2h(i%(16**5)%(16**4)/(15**3))
i2r2(i) = i2h(i%(16**5)%(16**4)%(16**3)/(15**2))
i2r1(i) = i2h(i%(16**5)%(16**4)%(16**3)%(16**2)/(15**1))
i2r0(i) = i2h(i%(16**5)%(16**4)%(16**3)%(16**2)%(16**1))
i2r(i) = i2r5(i).i2r4(i).i2r3(i).i2r2(i).i2r1(i).i2r0(i)

# rgb_iter: returns the i-th of n RGB codes, evenly spaced across the spectrum
rgb_iter(i, n) = '#'.i2r(round((i-1)*(16777215.0/(n-1))))

### first set up some basic plot parameters
set term png enhanced size 800,h font 'Courier-Bold,14'
set output 'waves.png'

set title 'Wave propagation by geophones'
set ylabel 'Wave'

set xrange [1400:]
set yrange [-0.15:0.15]
set ytics ('-0.1' -0.1, '0.0' 0.0, '0.1' 0.1)

set key out right

### now make plots
set multiplot layout indices,1

### first plot
set border 14
set tmargin at screen top(1,indices,h,d)
set bmargin at screen bot(1,indices,h,d)
unset xtics
plot 'temp.dat' index 0 w lines lw 3 lc rgb rgb_iter(1,indices) title 'Geophone 1'
unset title

### intermediate plots
set border 10
unset xlabel
do for [i=1:indices-2] {
 set tmargin at screen top(i+1,indices,h,d)
 set bmargin at screen bot(i+1,indices,h,d)
 plot 'temp.dat' index i w lines lw 3 lc rgb rgb_iter(i+1,indices) title sprintf('Geophone %d', i + 1)
}

### last plot
set border 11
set tmargin at screen top(indices,indices,h,d)
set bmargin at screen bot(indices,indices,h,d)
set xtics nomirror
set xlabel 'Iterations'
plot 'temp.dat' index (indices-1) w lines lw 3 lc rgb rgb_iter(indices,indices) title sprintf('Geophone %d', indices)

unset multiplot

サンプル データ セットの出力は次のようになります。 ここに画像の説明を入力

上/下のプロットのサイズは完全ではありません.mgilsonが言ったようset xmargin at screen ...に、すべてのプロットのサイズを等しくするには、おそらくコマンドをいじる必要があるでしょう.

(これらの int->RGB コンバーターは、特殊なアプリケーションに便利です。RGB コードから int に変換する関数もあります。)

編集:スクリプトを更新して、すべてのプロットが同じ高さになるようにしました。

于 2012-12-12T23:33:03.167 に答える
5

事前にプロット数がわかっている場合 (gnuplot 4.6):

NUM_PLOTS = 6
set multiplot layout NUM_PLOTS,1
do for [i=1:NUM_PLOTS]{
   plot 'temp.dat' index i w lines lw 3 title sprintf('Geophone %d', i + 1)
}
unset multiplot

境界線と軸が一列に並んでいることを本当に確認したい場合は、 、 、 、 の組み合わせを使用できますが、これらはとset lmargin at screen ...set rmargin at screen ...関数set tmargin at screen ...ですが、おそらくとを一定の位置に設定するだけで十分です (gnuplot は軸を共有する必要がない場合は、上から下への配置に注意してください)。set bmargin at screen ......iNUM_PLOTSlmarginrmargin

set border 10本当に必要な場合は、上下の境界線を削除しますが、おそらく必要ではありません。

次のようなものをお勧めします:

NUM_PLOTS = 6
set multiplot layout NUM_PLOTS,1
set lmargin at screen 0.1
set rmargin at screen 0.9
do for [i=1:NUM_PLOTS]{
   plot 'temp.dat' index i w lines lw 3 title sprintf('Geophone %d', i + 1)
}
unset multiplot
于 2012-12-12T21:53:28.170 に答える