使用gnuplot:
生成以下图表它显示5(但可能更多或更少)波。但是,我需要的是分别显示每个波形,就像这样(我用gimp做的):
有没有办法用gnuplot做到这一点?我还需要每一波都是不同的颜色,就像我现在一样。
以下是使用的gnuplot脚本:http://pastebin.com/vAD2syTS
以下是gnuplot脚本用于修复我的数据的python脚本:http://pastebin.com/WEncNjDA
以下是数据:http://pastebin.com/ewBpvHWM
以下是python脚本修复后的数据:http://pastebin.com/cgimMyr9
答案 0 :(得分: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 ...
和set bmargin at screen ...
的组合其中...
是i
和NUM_PLOTS
的某种功能,尽管可能将lmargin
和rmargin
设置在某个固定位置就足够了(gnuplot应该注意如果您不需要共享轴,则从上到下对齐。)
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
答案 1 :(得分:5)
我对这个玩得很开心。我的策略是绘制具有略微不同设置的第一个,最后一个和中间的绘图,以使边界排列。我还定义了一些函数来确保所有的绘图颜色确实不同,除非你有大约1600万个数据集要绘制。
### 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代码到整数的功能。)
编辑:我更新了脚本,所以所有的图都具有相同的高度。