在gnuplot中基于数据文件绘制二维图中的水平直线
在Gnuplot中从数据文件绘制多条水平直线
我来帮你搞定这个问题~你之前的尝试没成功,主要是因为Gnuplot没法直接在循环里从数据文件读取单个值赋值给变量,而且单个数据点默认只会画点,不是直线。下面给你两种实用的解决方案:
方法一:用向量样式一次性绘制所有水平直线
这是最简洁高效的方式,适合所有直线样式统一的场景:
# 先设置你的x轴范围(替换成你实际需要的x起止值) x_start = 0 x_end = 20 # 读取data.dat第2列的每个数值C,绘制从(x_start,C)到(x_end,C)的水平直线 plot "data.dat" u (x_start):2:(x_end):2 with vectors nohead notitle lt 1 lc rgb "#ff4444"
with vectors nohead:用无箭头的向量来模拟直线,每个数据点对应一条水平向量(x_start):2:(x_end):2:分别指定向量的起点x、起点y、终点x、终点y,其中y值就是数据文件第2列的数值
方法二:循环读取每个数据点绘制直线
如果需要给每条直线设置不同的样式(比如颜色、线宽),可以用这个方法:
# 先统计数据文件的行数,结果存在STATS_records变量里 stats "data.dat" u 2 nooutput # 循环每一行数据 do for [i=0:int(STATS_records-1)] { # 用value()函数读取第i+1行第2列的数值(Gnuplot行索引从0开始) C = value("data.dat", i+1, 2) # 绘制水平直线,x范围用当前图的x轴范围 replot C notitle with lines lt (i%5+1) lc rgb hsv2rgb(i/STATS_records,1,0.8) }
stats ... nooutput:只统计数据不输出统计信息value():从指定文件的指定行列读取数值replot:在已有图上叠加绘制,避免每次循环覆盖之前的内容
纠正你之前的错误尝试
for [i=1:10] "data.dat" u 2 every ::i::i:这个命令只会读取第i行第2列的单个点,绘制的是散点而不是直线x = "data.dat" u 2 every ::i::i:这不是合法的Gnuplot语法,不能直接把数据文件的列赋值给变量,必须用value()或者stats来提取数值
内容的提问来源于stack exchange,提问作者NE555
相关产品推荐
相关产品推荐

