如何在Gnuplot中堆叠脉冲

如何在Gnuplot中堆叠脉冲,gnuplot,Gnuplot,我使用Gnuplot显示过去13个月内测得的降水量。从两个数据文件rain.dat和snow.dat读取数据。我使用冲动,但在下雨和下雪的日子里,冲动是相互叠加的。如果把冲动叠加起来就更好了。 如何将脉冲与Gnuplot叠加 #!/usr/bin/gnuplot -persist set xdata time set timefmt "%d.%m.%Y" set ylabel "Precipitation (mm)" set xrange ["0

我使用Gnuplot显示过去13个月内测得的降水量。从两个数据文件rain.dat和snow.dat读取数据。我使用冲动,但在下雨和下雪的日子里,冲动是相互叠加的。如果把冲动叠加起来就更好了。 如何将脉冲与Gnuplot叠加

#!/usr/bin/gnuplot -persist
set xdata time
set timefmt "%d.%m.%Y"
set ylabel "Precipitation (mm)"
set xrange ["01.`date --date="1 year ago" +%m.%Y`":"01`date --date="1 month" +.%m.%Y`"]
set xtics "01.`date --date="1 year ago" +%m.%Y`",2800000, \
          "01.`date --date="now 1 month" +%m.%Y`" offset 3,0.2
set format x "%b"
set style line 100 lt 3 lc rgb "gray" lw 0.5
set style line 101 lt 3 lc rgb "gray" lw 0.5
set grid back xtics ytics mytics ls 100, ls 100, ls 101
set terminal png size 1000,200
set output 'precipitation.png'
plot 'rain.dat' using 1:2 title 'Rain' w impulses lt rgb '#ff0000' lw 4 , \
     'snow.dat' using 1:2 title 'Snow' w impulses lt rgb '#0000ff' lw 2

rain.dat:
16.02.2021 8
22.02.2021 6
04.03.2021 10
08.03.2021 13
14.03.2021 5

snow.dat:
19.02.2021 19
22.02.2021 10
04.03.2021 14
12.03.2021 8

脉冲不能叠加。根据定义,它们从y=0扩展到某个非零y值

如果在同一组x坐标下对两个数据集进行采样,则可以使用堆叠直方图打印模式,但这里的情况并非如此

背对背的脉冲而不是堆叠的脉冲怎么样

$RAIN << EOD
16.02.2021 8
22.02.2021 6
04.03.2021 10
08.03.2021 13
14.03.2021 5
EOD

$SNOW << EOD
19.02.2021 19
22.02.2021 10
04.03.2021 14
12.03.2021 8
EOD

set xzeroaxis

plot $RAIN using 1:2 with impulse lw 3, \
     $SNOW using 1:(-$2) with impulse lw 3

$RAIN正如@Ethan已经提到的,
脉冲总是从
0开始。如果你不介意做一些额外的努力,你可以模仿“叠加”脉冲,如果你先用“雪的颜色”绘制雨和雪的总和,然后用“雨的颜色”单独绘制雨

但是你如何计算雨和雪的总和呢

  • 将数据块(或文件)打印到临时数据块
    $Temp
  • 使用“平滑频率”选项将数据块
    $Temp
    绘制到数据块
    $SnowAndRain
    中,该选项汇总每天的雪和雨。选中“帮助平滑”
代码:

### "stacked" impulses
reset session

$Rain <<EOD
16.02.2021 8
22.02.2021 6
04.03.2021 10
08.03.2021 13
14.03.2021 5
EOD

$Snow <<EOD
19.02.2021 19
22.02.2021 10
04.03.2021 14
12.03.2021 8
EOD

set xdata time
myTimeFmt = "%d.%m.%Y"
set timefmt myTimeFmt

set table $Temp
    plot $Snow u (strftime(myTimeFmt,timecolumn(1,myTimeFmt))):2 w table
    plot $Rain u (strftime(myTimeFmt,timecolumn(1,myTimeFmt))):2 w table
set table $SnowAndRain
    plot $Temp u (timecolumn(1,myTimeFmt)):2 smooth freq
unset table

set format x "%d %b"
plot $SnowAndRain u (timecolumn(1,'"'.myTimeFmt.'"')):2 w impulses lw 4 lc "blue" title 'Snow', \
     $Rain u 1:2 w impulses lc "red" lw 4 title 'Rain', \
### end of code
####“叠加”脉冲
重置会话

$Rain我试图简化@theozh的答案,但有些脉冲在时间上有轻微位移@theozh对我的问题有一个更好的解决方案

reset session

$Rain <<EOD
16.02.2021 8
22.02.2021 6
04.03.2021 10
08.03.2021 13
14.03.2021 5
EOD

$Snow <<EOD
19.02.2021 19
22.02.2021 10
04.03.2021 14
12.03.2021 8
EOD

myTimeFmt = "%d.%m.%Y"

set table $Temp
    plot $Snow u (timecolumn(1,myTimeFmt)):2 w table
    plot $Rain u (timecolumn(1,myTimeFmt)):2 w table
unset table

set table $SnowAndRain
     plot $Temp u 1:2 smooth freq
unset table

set format x "%d %b" timedate
plot $SnowAndRain u 1:2 w impulses lw 4 lc "blue" title 'Snow', \
     $Rain u (timecolumn(1,myTimeFmt)):2 w impulses lc "red" lw 4 title 'Rain', \
### end of code
重置会话

$Rain这不显示每天的总降水量。如果雨和雪的数据都写入一个文件而不是单独的文件,也许我可以使用直方图?只有当格式类似于
date rain snow
时,将数据集合并到一个文件中才有帮助。这样,每个日期(x坐标)都有雨和雪条目。现在的问题是,这两个数据集没有相同的x坐标集。在Windows 10中,输出是正确的,但在Raspbian Stretch和Gnuplot 5.0中,图形是完全错误的。我得到“警告:空x范围[-6.2041e+10:-6.2041e+10],调整到[-6.26614e+10:-6.14206e+10]”。表$Temp的第一行是“1.61369e+09 19”。Linux中的时间格式显然有问题。@EddySorngard ok,用Win10和gnuplot 5.2.0进行了测试,结果正常。但是,Win10和gnuplot 5.0.0到5.0.6给出了错误的结果。现在,我不知道是什么。因此,可能没有特定的Linux问题,而是gnuplot版本问题。我将尝试找出答案。添加操作也适用于Linux,但如果我尝试像以前一样将绘图时间延长到13个月,在设置格式x“%d%b”timedate之前添加set xrange[“01.
date--date=“1年前”+%m.%Y
”:“01.
date--date 1个月”+。%m.%Y
”]我会得到“不能使用空的x范围绘图!”@EddySorngard此
date--date=“1年前”+%m.%Y
在Windows中不存在。我不确定它在Linux下的gnuplot中是否能以这种方式工作。如果您想将范围设置为从现在开始的最后一年(过去365天+30天),那么对于添加,我将使用gnuplot命令:
now=time(0);设置xrange[now-3600*24*365:now+3600*24*30]
。检查
帮助时间
。如果您需要正好减去1年,直到本月底,那么有一个更复杂的gnuplot解决方案。这在Linux和gnuplot 5.0中也适用。但是,如何使x轴看起来像我最初问题中的图形,只有月份的名称?或者可以用“1.Mar”代替“01 Mar”?你确定吗?你为什么认为
smooth
不接受浮点数?@theozh,我的错误,smoth中的整数转换是不必要的。那么简化就更简单了。我有这个版本,我不满意。你放大了吗(例如在wxt终端中)?如果你放大得很近,你会注意到在某些情况下,红色和蓝色脉冲并不完全在彼此的顶部。这就是为什么我在回答中提出了更复杂的加法。@theozh,我没有注意到,但现在我明白了。解决办法太简单了。“我将详细说明我的答案。”theozh,现在我添加了一个更好的解决方案。
reset session

$Rain <<EOD
16.02.2021 8
22.02.2021 6
04.03.2021 10
08.03.2021 13
14.03.2021 5
EOD

$Snow <<EOD
19.02.2021 19
22.02.2021 10
04.03.2021 14
12.03.2021 8
EOD

myTimeFmt = "%d.%m.%Y"

set table $Temp
    plot $Snow u (timecolumn(1,myTimeFmt)):2 w table
    plot $Rain u (timecolumn(1,myTimeFmt)):2 w table
unset table

set table $SnowAndRain
     plot $Temp u 1:2 smooth freq
unset table

set format x "%d %b" timedate
plot $SnowAndRain u 1:2 w impulses lw 4 lc "blue" title 'Snow', \
     $Rain u (timecolumn(1,myTimeFmt)):2 w impulses lc "red" lw 4 title 'Rain', \
### end of code
reset session

$Rain <<EOD
16.02.2021 8
22.02.2021 6
04.03.2021 10
08.03.2021 13
14.03.2021 5
EOD

$Snow <<EOD
19.02.2021 19
22.02.2021 10
04.03.2021 14
12.03.2021 8
EOD

myTimeFmt = "%d.%m.%Y"

set table $Temp
    plot $Snow u (timecolumn(1,myTimeFmt)):2 w table
    plot $Rain u (timecolumn(1,myTimeFmt)):2 w table
unset table

set table $SnowAndRain
     plot $Temp u 1:2 smooth freq
unset table

set table $RainTemp
    plot $Rain u (timecolumn(1,myTimeFmt)):2 w table
unset table

set format x "%d %b" timedate
plot $SnowAndRain u 1:2 w impulses lw 4 lc "blue" title 'Snow', \
     $RainTemp u 1:2 w impulses lw 4 lc "red" title 'Rain'