我有一个包含3列数据的文件。第一列包含x坐标,第三列包含y坐标。第二列包含值(例如,假设它具有来自集合{0, 1, 2}
的值),具体取决于哪个,确定绘制点的颜色和类型。我使用以下命令进行绘图:
plot "< awk '{if($2 == \"0\") print}' out.txt" using 1:3 title "Label 0" with points pointtype 1 lc rgb '#990000'
"< awk '{if($2 == \"1\") print}' out.txt" using 1:3 title "Label 1" with points pointtype 2 lc rgb '#990055'
"< awk '{if($2 == \"2\") print}' out.txt" using 1:3 title "Label 2" with points pointtype 3 lc rgb '#990099'
这很好用。但是现在,我希望实现以下目标:
(1st column, 3rd column)
对应(xi, yi)
,那么根据yi
的值,我希望在(xi, Yi)
处绘制一个点有人可以帮我吗?谢谢。
PS:我是gnuplot的初学者。我不确定这是一个非常简单的问题。
提前致谢。
以下是样本数据和我的期望的一个例子。
Sample Data: Expected point:
0 0 34 (0, 30) Red
0 1 10 (0, 10) Green
0 2 44 (0, 40) Blue
1 0 50 (1, 50) Red
1 1 49 (1, 50) Green
1 2 48 (1, 50) Blue
2 0 46 (2, 50) Red
2 1 49 (2, 50) Green
2 2 46 (2, 50) Blue
3 0 45 (3, 50) Red
3 1 46 (3, 50) Green
3 2 48 (3, 50) Blue
4 0 68 (4, 70) Red
4 1 44 (4, 40) Green
4 2 46 (4, 50) Blue
5 0 43 (5, 40) Red
5 1 44 (5, 40) Green
5 2 44 (5, 40) Blue
6 0 43 (6, 40) Red
6 1 42 (6, 40) Green
6 2 46 (6, 50) Blue
答案 0 :(得分:3)
首先,我不认为您需要在当前代码中使用awk。在gnuplot中跳过行的常见技巧是使用这样的三元运算符:
plot 'out.txt' using ($2 == 0 ? $1 : 1/0):3 title "Label 0" with points pointtype 1 lc rgb '#990000'
x
坐标设置为1/0
(即inf
),除非第二列中的值为0
,这意味着跳过了数据点。< / p>
如果要为给定的y
对绘制完全不同的(x, y)
坐标,可以使用以下内容:
x = 4
y = 2
Y = 10
plot 'out.txt' using ($2 == 0 ? $1 : 1/0):($1 == x && $3 == y ? Y : $3) title "Label 0" with points pointtype 1 lc rgb '#990000'
如前所述,当第二列与所需值不匹配时,将跳过该行。我还添加了一个条件,当第一列和第三列与变量x
和y
匹配时,使用Y
的值而不是第三列。
要根据y
的当前值执行计算,您可以使用函数f(y)
而不是变量Y
。例如,要舍入到最接近的值10,您可以声明此函数:
f(y) = round(y / 10) * 10
然后将Y
替换为f($3)
。
另外,awk程序的结构为condition { action }
,默认操作为{ print }
,因此如果您要使用awk,则可以简化为awk '$2 == 0'
(它&# 39; s也没有必要引用0
)。