使用Gnuplot有条件地绘制点的颜色

6
我有一个包含四列数据的文件。我只使用前三列来绘制3D图,暂时不需要第四列。
我想知道如何根据特定条件更改点的颜色。例如,如果点的值(x,y,z)大于(16,400,65),则将其绘制为灰色。如果小于,我想用红色表示。
我尝试使用 awk 进行操作,并在不同颜色下绘制了两个点。以下是我的代码。
gnuplot>splot "< awk '{if( ($2 > \"16\") || ($1 > \"400\") || ($3 > \"65\"))  print}'                                       
./8_77_non_pareto_data.dat " u 2:1:3 w p pt 8 lc rgb "grey", \
"< awk '{if( ($2 < \"16\") || ($1 < \"400\") || ($3 < \"65\"))  print}' 
./8_77_non_pareto_data.dat " u 2:1:3 w p pt 8 lc rgb "red", \
"./8_77_pareto_data.dat" u 2:1:3 w i lt 1 lc rgb "blue" t "Pareto points"

我的数据文件长这样:
48      15.057599573464184      68      361
93      14.950459657063462      73      361
48      14.065204842090914      69      361
280     13.16320458043516       69      361
120     15.05281009307949       66      361
48      15.133322961840786      59      361
48      16.161631503473544      73      361
470     17.763180586730847      77      361

X轴范围从6到22。

Y轴范围从0到500。

Z轴范围从35到85。

我想以三维方式在(16,400,65)周围呈现一个边界框。盒子里的所有内容都是红色的,盒子外的所有内容都是灰色的。

希望有人可以在这里帮助我。

P.S: 蓝点打印得很好,虽然这里的示例数据没有显示出一些条件被满足,但有些点确实满足该条件。我没有在此处发布整个文件。


相等情况:https://dev59.com/Lmoy5IYBdhLWcg3wL7L1 - Ciro Santilli OurBigBook.com
1个回答

5
您可以通过定义一个简单的函数来在纯gnuplot中减少awk的工作量:
#!/usr/bin/env gnuplot

set terminal png set output 'test.png'

bigx = 16; bigy = 400; bigz = 65

isbig(x,y,z) = (x > bigx || y > bigy || z > bigz) ? 1 : 0

set palette defined (0 0.5 0.5 0.5, 1 1 0 0) # (grey, red)

unset colorbox
set xrange [0:20]; set yrange [0:500]; set zrange [0:100]

splot 'data.dat' using 2:1:3:(isbig($2,$1,$3)) with points pt 7 palette notitle, \
      '' using (1e6):1:1 with points pt 7 lc rgb '#888888' title 'in box', \
      '' using (1e6):1:1 with points pt 7 lc rgb 'red' title 'not in box'

(设置范围和取消colorbox的行,以及两个额外的绘图命令,只是为了让事情看起来漂亮而已。它提供了一个键,描述了这两种颜色的含义,而不会分散注意力。)
(上图)

另一个快速问题。假设我有两个文件,都像上面描述的那样。一个保存最优数据,而我向您展示的一个保存非最优/次优数据。我的目标是在同一图中绘制两者,尽管非最优点落在灰色边界框之外,子最优点在红色点内(这两个在一个文件中),而最优点则用蓝色脉冲表示(这些在另一个文件中)。现在,如果我尝试在同一图中绘制最优点,则所有点都会变成灰色。请指教? - adwaraki
听起来你遇到了一个稍微不同的问题,我建议你将它作为一个新问题发布,附上能够重现问题的脚本和数据示例。目前我怀疑调色板是问题所在,但我不确定。另外,看起来你还是SO的新手,我想提醒一下,如果你喜欢一个答案,除了接受以外,点个赞也是常见的礼貌行为 :) - andyras
我会做的。谢谢。但是当我尝试点赞它时(昨天我已经尝试过了:)),它说需要至少15个声望点才能点赞。我该怎么做? - adwaraki
有几种方法可以获得声望(http://stackoverflow.com/faq#reputation),但总的来说,只要不断地提出和回答好问题就行了! - andyras
你能否详细说明一下你示例中的最后两行?或者说,我可以使用“点”来表示“外部”的元素,而使用“脉冲”来表示“内部”的元素吗?目前,我认为splot的第一行正在决定我的绘图风格。还有其他方法可以实现吗? - adwaraki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接