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

如何在gnuplot中填充不同数据文件间的曲线区域?

在gnuplot中跨数据文件填充曲线间区域

问题背景

填充同一数据文件内两条曲线间的区域时,一般会用这样的gnuplot命令:

plot "data" using 1:2, \
     "data" using 1:3, \
     "data" using 1:2:3 with filledcurves, \
    "data2" using 1:2, \
    "data2" using 1:4, \
    "data2" using 1:2:4 with filledcurves

现在需要在不修改原始数据文件的前提下,填充data文件第1列(x轴)、第2列(y值)与data2文件第1列(x轴)、第4列(y值)之间的区域,预期代码结构如下:

plot "data" using 1:2, \
    "data2" using 1:4, \
    ??????????? with filledcurves

数据样本

data文件示例:

1736683200  24.28  24.83  1012  79  0.0   12  56
1736694000  24.71  25.09  1011  71  0.0   17  38
1736704800  24.29  24.6   1010  70  0.0   10  53
1736715600  23.6   24.03  1012  77  0.13  7   66
1736726400  23.05  23.47  1011  79  0.32  7   79
1736737200  22.37  22.8   1010  82  0.18  3   88
1736748000  22.15  22.61  1012  84  0.22  4   66
1736758800  22.92  23.36  1012  80  0.49  2   77
1736769600  24.33  24.72  1011  73  0.35  12  41
1736780400  24.62  24.89  1010  67  0.0   15  27
....

data2文件示例:

1736676000  24.6  21.4  1011.8  0  0.0  13.0  85
1736679600  24.9  21.3  1011.6  0  0.0  16.7  83
1736683200  25.2  21.2  1011.4  0  0.0  18.5  74
1736686800  25.2  21.1  1010.9  0  0.0  18.5  76
1736690400  25.2  21.0  1010.3  0  0.0  18.5  78
1736694000  25.2  20.9  1009.8  0  0.0  20.4  82
1736697600  24.7  20.7  1009.8  0  0.0  18.5  82
1736701200  24.2  20.5  1009.7  0  0.0  16.7  83
1736704800  23.7  20.4  1009.7  0  0.0  14.8  83
1736708400  23.6  20.4  1010.3  0  0.0  13.0  85

解决方案

gnuplot的filledcurves要求用于填充的两个y值必须来自同一数据行,所以跨文件填充的关键是把两个文件中对应x值的y数据合并到同一行。

方法1:用外部命令合并匹配数据(x轴有重合值时适用)

如果两个文件的x轴(时间戳)存在完全匹配的点,直接用系统的join命令按x值合并数据,在gnuplot中调用这个合并后的数据流即可:

plot "data" using 1:2 title "data: 第2列", \
     "data2" using 1:4 title "data2: 第4列", \
     "< join -j 1 data data2" using 1:2:11 with filledcurves title "填充区域"
  • 细节说明:join -j 1 data data2会按第1列(时间戳)匹配两行,输出格式为[时间戳] [data的第2-8列] [data2的第2-8列]。因此data的第2列对应合并后数据的第2列,data2的第4列对应合并后数据的第11列(9 + (4-2) = 11)。
  • 若需要保留所有x值(包括不匹配的),可以用join -a 1 -a 2 -j 1 data data2,但要自行处理缺失值(比如用0填充或插值)。

方法2:用gnuplot插值对齐数据(x轴不完全重合时适用)

如果两个文件的x轴没有完全匹配的点,先对其中一个数据集插值,对齐到另一个数据集的x轴:

# 生成data2第4列的插值数据,对齐到data文件的x轴
set table "temp_interp.dat"
plot "data2" using 1:4 smooth csplines
unset table

# 合并data与插值后的临时文件,提取需要的列
plot "data" using 1:2 title "data: 第2列", \
     "data2" using 1:4 title "data2: 第4列", \
     "< paste data temp_interp.dat | awk '{print $1, $2, $10}'" using 1:2:3 with filledcurves title "填充区域"
  • 细节说明:smooth csplines会生成平滑的插值曲线,paste命令将原始data文件和插值后的临时文件按行合并,最后用awk提取需要的x、y1、y2列用于填充。用完可以删除临时文件temp_interp.dat。

额外调整

可以通过参数修改填充区域的样式,比如设置颜色:

"< join -j 1 data data2" using 1:2:11 with filledcurves fillcolor rgb "#ADD8E6" title "填充区域"

内容的提问来源于stack exchange,提问作者Luis A. Florit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:04:51