Awk 如何根据测试条件使用文件中的x坐标和y坐标在gnuplot中绘制点?

Awk 如何根据测试条件使用文件中的x坐标和y坐标在gnuplot中绘制点?,awk,plot,gnuplot,Awk,Plot,Gnuplot,我有一个包含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\") p

我有一个包含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'

首先,我认为您不需要在当前代码中使用awk。在gnuplot中跳过行的常见技巧是使用如下三元运算符:

plot 'out.txt' using ($2 == 0 ? $1 : 1/0):3 title "Label 0" with points pointtype 1 lc rgb '#990000'
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坐标设置为1/0,即inf,除非第二列中的值为0,这意味着跳过数据点

如果要为给定的x,y对绘制完全不同的y坐标,可以使用以下方法:

plot 'out.txt' using ($2 == 0 ? $1 : 1/0):3 title "Label 0" with points pointtype 1 lc rgb '#990000'
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执行计算,可以使用函数fy而不是变量y。例如,要舍入到最接近的值10,可以声明此函数:

f(y) = round(y / 10) * 10
然后将Y替换为f$3


另外,awk程序的结构是条件{action},默认操作是{print},因此如果要使用awk,可以简化为awk'$2==0',也不需要引用0。

首先,我认为在当前代码中不需要使用awk。在gnuplot中跳过行的常见技巧是使用如下三元运算符:

plot 'out.txt' using ($2 == 0 ? $1 : 1/0):3 title "Label 0" with points pointtype 1 lc rgb '#990000'
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坐标设置为1/0,即inf,除非第二列中的值为0,这意味着跳过数据点

如果要为给定的x,y对绘制完全不同的y坐标,可以使用以下方法:

plot 'out.txt' using ($2 == 0 ? $1 : 1/0):3 title "Label 0" with points pointtype 1 lc rgb '#990000'
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执行计算,可以使用函数fy而不是变量y。例如,要舍入到最接近的值10,可以声明此函数:

f(y) = round(y / 10) * 10
然后将Y替换为f$3


另一方面,awk程序的结构是条件{action},默认操作是{print},因此如果要使用awk,可以简化为awk'$2==0',也不必引用0。

Yi是如何从Yi中确定的?@Tom Fenech,Yi可以通过一些简单的计算从Yi中派生出来,或者它可能是一个常量。比如,如果文件中的值是5、0、73、6、1、78、7、2、84,我会选择Yi为80作为常量,或者为每个Yi选择10的最接近倍数。根据您的评论,您似乎建议将行分为三组-是这样吗?如果是这样的话,你想使用一个基于平均值的数字,四舍五入到最接近的10或者类似的数字,事情会变得更复杂一些。如果你只是想把数字四舍五入到最接近的10,那就很容易了。请澄清你的问题。显示一些样本数据总是有用的。Yi是如何从Yi中确定的?@Tom Fenech,Yi可能是通过一些简单的计算从Yi中推导出来的,也可能是一个常数。比如,如果文件中的值是5、0、73、6、1、78、7、2、84,我会选择Yi为80作为常量,或者为每个Yi选择10的最接近倍数。根据您的评论,您似乎建议将行分为三组-是这样吗?如果是这样的话,你想使用一个基于平均值的数字,四舍五入到最接近的10或者类似的数字,事情会变得更复杂一些。如果你只是想把数字四舍五入到最接近的10,那就很容易了。请澄清你的问题。显示一些示例数据总是很有用的。谢谢您优雅的回答。你能告诉我,是否有一种简单的方法可以用3美元进行一些“小”计算,并得到Y的值吗?例如Y=teny的最近倍数或Y=Y-Y | mod 10 |。@jsp99编辑以显示函数示例。希望有帮助。这是解决这个问题最优雅的方法。谢谢,谢谢你优雅的回答。你能告诉我,是否有一种简单的方法可以用3美元进行一些“小”计算,并得到Y的值吗?例如Y=teny的最近倍数或Y=Y-Y | mod 10 |。@jsp99编辑以显示函数示例。希望有帮助。这是解决这个问题最优雅的方法。非常感谢。