如何在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
相关产品推荐
相关产品推荐

