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

时间:2012-06-25 10:35:24

标签: 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的“线点”图,以及代表($ 2,$ 3)的每个组合的8条不同线,例如:(15,8),(15,2), ...

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

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

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分: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'

注意“&lt; 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'

也会奏效。系统上写入标准输出的任何命令都可以正常工作。

plot "<echo 1 2" w p  #plot the point (1,2)

您甚至可以使用管道:

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

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

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

gnuplot不是很有趣吗?

答案 1 :(得分:1)

...偶然发现了这个老问题...好吧,当您想绘制连接到with lines或{{ 1}}。有一个gnuplot本机解决方案。解决方法的“技巧”是将多个数据点相互绘制,并且仅在找到新点时才更改坐标。 代码很简单:

with linespoints

结果: enter image description here

添加:

仅出于完整性考虑。实际上,### conditional plot with connected lines or linespoints reset session # added two datapoints for testing purposes $Data <<EOD 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: 13:20:8:8.88888888: 15:15:8:9.99999999: 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: EOD set datafile separator ":" x0 = y0 = NaN plot $Data u ($2==15 && $3==8 ? (y0=$4,x0=$1) : x0):(y0) w lp pt 7 ### end of code 可以解决gnuplot5.x中的问题,但是由于该问题来自gnuplot4.6次,因此……有些人似乎仍在使用4.x版进行绘制。

set datafile missing "NaN"

SO_Filter.dat

代码:

# added two datapoints for testing purposes
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:
13:20:8:8.88888888:
15:15:8:9.99999999:
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:

gnuplot 4.6的结果:

enter image description here