如何在gnuplot中根据X值(年份)设置不同的线条线型?
在Gnuplot中按X轴范围设置折线不同线型的简便方案
需求说明
需要绘制以年份为X轴的折线图:
- 2022年及之前的实际数据段用实线连接
- 2022年之后的预测数据段用虚线连接
提供的数据如下:
| 年份 | 数值 |
|---|---|
| 1980 | 5 |
| 1990 | 10 |
| 2000 | 17 |
| 2010 | 27 |
| 2020 | 39 |
| 2022 | 44 |
| 2030 | 60 |
当前使用的命令只能画出整条实线:
plot 'input.dat' using 1:2 with lines dashtype 1
希望找到无需使用multiplot的简便方法,替代繁琐的多图拼接。
解决方案
无需用multiplot,在同一个plot命令中通过条件筛选数据即可实现分段线型,以下是两种通用方法:
方法1:基于X值的条件判断(推荐,不受数据行数影响)
利用Gnuplot的三元表达式,仅渲染符合X范围的数据点,自动分段:
plot 'input.dat' using 1:($1 <= 2022 ? $2 : NaN) with lines dashtype 1 title "实际数据", \ '' using 1:($1 >= 2022 ? $2 : NaN) with lines dashtype 0 title "预测数据"
$1 <= 2022 ? $2 : NaN:当X值≤2022时取对应Y值,否则返回NaN(不渲染)- 两段线会在2022的点上自然衔接,无需额外处理
dashtype 1对应实线,dashtype 0对应虚线(部分旧版本Gnuplot可替换为linetype)
方法2:基于数据行号的筛选
如果数据行固定,可以直接指定行范围(注意Gnuplot行号从0开始计数):
plot 'input.dat' using 1:2 every ::0::5 with lines dashtype 1 title "实际数据", \ '' using 1:2 every ::5::6 with lines dashtype 0 title "预测数据"
every ::0::5:选取第0到第5行(对应1980至2022的数据)every ::5::6:选取第5到第6行(对应2022至2030的数据)
说明
两种方法都在同一个绘图画布中完成,避免了multiplot的繁琐设置,同时保证折线在2022年的节点处完美连接。
内容的提问来源于stack exchange,提问作者mrleop
相关产品推荐
相关产品推荐

