graphics - Gnuplot:如何在多个数据块上用连续线绘制?
问题描述
我有一个 dat 文件,它被分成多个块,例如如下:
# Time (s) x (m)
0.0 0.0
1.0 1.0
2.0 2.0
3.0 3.0
4.0 4.0
5.0 5.0
5.0 10.0
6.0 11.0
7.0 12.0
8.0 13.0
9.0 14.0
10.0 15.0
以下最小脚本:
filename = 'test.dat';
set terminal pngcairo size 960, 540 font 'Verdana, 20'
set output "test.png"
unset key
set xlabel "Time (s)"
set ylabel "x (m)"
set grid
set autoscale fix
plot filename u 1:2 w l lw 1.0 lc rgb 'black' notitle
Gnuplot 绘制两条线,每个块一条。但是,由于两个块之间的 x 数据不连续,因此图中会出现跳跃。
我想在输出图中加入这两行,而不修改数据文件。有没有办法做到这一点?
也许可以通过读取每个块的最后一行和下一个块的第一行并在这两点之间绘制一条线来完成,但我不熟悉任何可以完成这项工作的内置函数。
解决方案
我想到的第一种方法是将数据绘制到表格中。这将删除空行。也许有更好的方法。
代码:
### remove empty lines in data
reset session
$Data <<EOD
# Time (s) x (m)
0.0 0.0
1.0 1.0
2.0 2.0
3.0 3.0
4.0 4.0
5.0 5.0
5.0 10.0
6.0 11.0
7.0 12.0
8.0 13.0
9.0 14.0
10.0 15.0
EOD
set table $Data2
plot $Data u 1:2 w table
unset table
plot $Data2 u 1:2 w l
### end of code
补充:
实际上,在一行代码中还有另一种方法(虽然也不太明显),它不会复制内存中的数据(可能只与大数据相关)。您可以使用undefine $Data
我猜想会释放$Data
.
下面的单行代码将给出与上面的表格过程相同的结果。数据被绘制为从一个数据点到下一个数据点的向量,因此也忽略了空行。
plot x1=y1=NaN $Data u (x0=x1):(y0=y1):(x1=$1,x1-x0):(y1=$2,y1-y0) w vec nohead notitle
结果:
推荐阅读
- vue.js - '[Vue 警告] 的可能原因:数据函数应该返回一个对象:'
- java - 错误:无法找到或加载主类 org.apache.catalina.startup.Bootstrap
- ios - 在没有开发人员程序的情况下在单个设备上安装 iOS 应用程序
- c# - OR 运算符问题的可能速记解决方案
- javascript - IE 中的 window.open 对齐问题
- flutter - 如何在flutter中使用sqlite的EXISTS命令
- python - Python:如何调用脚本中的函数以在不同的venv中调用?
- html - 无法将引导列设置为不显示
- aws-cdk - 在 CI 环境中运行 CDK 部署
- android - 如何将 MediaScannerConnection 与 Uri 一起使用