Gnuplot:有线条的条件绘图($ 2 == 15?$ 2:'1/0')

Bas*_*aik 22 conditional gnuplot

我的数据如下:

10:15:8:6.06000000:
10:15:2:19.03400000:
10:20:8:63.50600000:
10:20:2:24.71800000:
10:25:8:33.26200000:
10:30:8:508.23400000:
20:15:8:60.06300000:
20:15:2:278.63100000:
20:20:8:561.18000000:
20:20:2:215.46600000:
20:25:8:793.36000000:
20:25:2:2347.52900000:
20:30:8:5124.98700000:
20:30:2:447.41000000:
(...)

我想在x轴上用$ 1绘制一个"线点"图,用8个不同的线代表($ 2,$ 3)的每个组合,例如:(15,8),(15,2),......

为了进行这种条件绘图,人们建议如下:

plot 'mydata.dat'  using 1:($2==15 && $3==8 ? $4 : 1/0) with  linespoints 'v=15, l=8'
Run Code Online (Sandbox Code Playgroud)

但是,gnuplot无法通过这些点绘制一条线,因为"​​1/0"无效并插入以替换($ 2 == 15 && $ 3 == 8)不成立的每个数据点.

此外,建议"再次绘制最后一个数据点"而不是使用"1/0"不起作用,因为我在两个变量上使用条件.

真的没有办法告诉gnuplot忽略文件中的条目,而不是绘制无效的"1/0"数据点吗?请注意,将其替换为"NaN"会产生相同的结果.

现在,我正在使用bash和awk预处理我的所有数据文件(通过将它们分成单独的文件然后可以在同一图中绘制),但这不太理想......

谢谢!

mgi*_*son 12

+1是一个很棒的问题.我(错误地)会想到你所拥有的东西会起作用,但看着help datafile using examples表明我其实是错的.您所看到的行为是记录在案的.感谢今天教我一些关于gnuplot的新东西:)

"预处理"(显然)是这里需要的,但临时文件不是(只要您的gnuplot版本支持管道).像上面的例子一样简单的东西都可以在gnuplot脚本中完成(虽然gnuplot仍然需要将"预处理"外包给另一个实用程序).

这是一个避免临时文件生成的简单示例,但用于awk执行"繁重的工作".

set datafile sep ':'  #split lines on ':'
plot "<awk -F: '{if($2 == 15 && $3 == 8){print $0}}' mydata.dat" u 1:4 w lp title 'v=15, l=8'
Run Code Online (Sandbox Code Playgroud)

注意"<awk ...".Gnuplot打开一个shell,运行命令,并从管道中读回结果.无需临时文件.当然,在这个例子中,我们可以{print $1,$4}(而不是{print $0})将所有使用规范放在一起,例如:

plot "<awk -F: '{if($2 == 15 && $3 == 8){print $1,$4}}' mydata.dat" w lp title 'v=15, l=8'
Run Code Online (Sandbox Code Playgroud)

也会工作.系统上写入标准输出的任何命令都可以.

plot "<echo 1 2" w p  #plot the point (1,2)
Run Code Online (Sandbox Code Playgroud)

你甚至可以使用管道:

plot "<echo 1 2 | awk '{print $1,$2+4}'" w p #Plots the point (1,6)
Run Code Online (Sandbox Code Playgroud)

与任何编程语言一样,请记住不要运行不受信任的脚本:

HOMELESS="< rm -rf ~"
plot HOMELESS  #Uh-oh (Please don't test this!!!!!)
Run Code Online (Sandbox Code Playgroud)

gnuplot不是很有趣吗?

  • 这是解决问题的一种有趣方式,谢谢!但是,如果gnuplot不符合某个标准,它是否能够告诉它忽略某些数据点? (5认同)