如何在 Gnuplot 中叠加脉冲

How to stack impulses in 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 ["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:(-) with impulse lw 3

正如@Ethan 已经提到的,with impulses 将始终从 0 开始。如果你不介意一些额外的努力,你可以模仿“堆叠”的冲动,如果你首先用“雪色”绘制雨雪的总和,然后单独用“雨色”绘制雨水.

但是你怎么得到雨雪的总和呢?

  • 将您的数据块(或文件)绘制到临时数据块中 $Temp
  • 使用选项 smooth frequency 将数据块 $Temp 绘制到数据块 $SnowAndRain 中,该选项总结了每天的雪和雨。检查 help smooth.

代码:

### "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

结果:

加法:

有点麻烦的解决方案似乎适用于 gnuplot 5.0.0(至少适用于 Win10)。我希望有人能简化这个。

代码:(使用Win10 gnuplot 5.0.0测试,结果同上)

### "stacked" impulses (should work with gnuplot 5.0.0)
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 (t=timecolumn(1,myTimeFmt)/1e5,int(t)):2:((t-int(t))*1e5) w table
    plot $Rain u (t=timecolumn(1,myTimeFmt)/1e5,int(t)):2:((t-int(t))*1e5) w table
unset table

set table $SnowAndRain
    set format x "%.0f"
    plot $Temp u (*1e5+):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

我试图对@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

加法:

如果在绘制图形之前使用 (timecolumn(1,myTimeFmt)):2 将 $Rain 写入 table $RainTemp,则雨和雪脉冲会相互叠加。但是时间还是有点不对。

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'