You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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è

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:07:19