Gnuplot:如何实现fsteps曲线与零值区域的填充?
Gnuplot 填充fsteps与零值区域的解决方案
问题1:有没有更简便的实现方式?用boxes是否可行?
完全可以用boxes命令实现,这是最简便的方案。因为fsteps的左对齐阶梯形态,和boxes默认的左对齐效果完全匹配(只要把boxwidth设为和每日数据间隔匹配的值)。
举个具体例子,假设你的数据文件daily.dat是两列:日期(或整数序号)、每日数值,直接用下面的命令就能填充boxes与零值之间的区域:
set boxwidth 1 # 每日数据间隔为1,刚好覆盖单日区间 plot 'daily.dat' using 1:2 with boxes fill solid 0.7, \ 0 with lines lc rgb 'black' # 绘制零值参考线
如果你的x轴是时间格式(比如%Y-%m-%d),把boxwidth改成时间单位即可:
set boxwidth 1 day set xdata time set timefmt "%Y-%m-%d" plot 'daily.dat' using 1:2 with boxes fill solid 0.7, 0 with lines
这种方式不需要修改任何原始数据,比手动构建阶梯线高效得多。
问题2:能否在Gnuplot内部生成fsteps阶梯线?
当然可以,不用依赖外部工具生成阶梯点,有两种常用方法:
方法1:用smooth fsteps配合filledcurves
直接利用Gnuplot内置的平滑函数生成左对齐阶梯线,再用filledcurves填充与零值的区域:
plot 'daily.dat' using 1:2 smooth fsteps with filledcurves y1=0 fill solid 0.7, \ 0 with lines
这个命令会先把原始数据转换成fsteps形态的阶梯线,再自动填充它和零值之间的区域,完全不需要手动处理数据点。
方法2:手动用using语句生成阶梯点
如果需要更精细的控制,可以通过using语句在Gnuplot内部为每个数据点生成两个阶梯点。假设x是整数日期序号,命令如下:
plot 'daily.dat' using 1:2:($1+1):2 with filledcurves x1=x2 fill solid 0.7, \ 0 with lines
原理是把每个(x,y)扩展成(x,y)和(x+1,y)两个点,用filledcurves连接这两个点并填充到零值,实现和fsteps完全一致的效果。
内容的提问来源于stack exchange,提问作者Francesco Potortè
相关产品推荐
相关产品推荐

