5

我有一个包含四列数据的文件。我只使用前三个来绘制 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)周围有一个边界框。盒子里面的东西都是红色的,外面的东西都是灰色的。

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

PS:蓝点打印得很好,虽然这里的示例数据没有显示满足某些条件,但有些点满足该条件。我没有在这里发布整个文件。

4

1 回答 1

5

您可以通过定义一个简单的函数来稍微减少 awk 的工作量并在纯 gnuplot 中完成:

#!/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'

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

在此处输入图像描述

于 2013-02-21T03:16:38.420 回答