按 x-y 坐标排序

sorting by x-y-coordinaten

我想在 gnuplot 中绘制所有位于圆上的结果。对于每个值,我都有相应的 x-y 坐标和相应的 ID 号(总共 4 列),但顺序未排序。行的排序方式是旋转方向从 -x => -y => +x => +y 到 -x 结束。所以圆心在 0。如何用“sort”(或者用“awk”?)命令(使用 Linux)实现这个?

根据 Theozh 的建议,我会更准确地表述我的问题。 想象一下带有小点作为分钟符号的时钟表盘。分点的位置可以通过极坐标或笛卡尔坐标来确定。我的文件包含具有关联值(结果)的笛卡尔坐标。该文件包含 60 行 x - y 坐标和第三列中的结果。当然,根据象限,x 和 y 的符号会发生变化。不幸的是,这些线条并没有按照与流通感相对应的方式进行排序。因此,“第 30 分钟”点所在的行不在第 30 行,而是例如在第 17 行。任务是按坐标对线进行排序,使它们按从 1 到 60 的顺序出现。在图中,x 轴然后简单地定义为从 1 到 60,然后 y 轴将包含结果(从第 3 列开始)

我的未排序文件(单位圆的坐标,为了更好地概览而简化的结果值)

这就是我想要的(8 行(每 45°)逆时针排序):

可以使用 atan2() 函数从 x/y 坐标直接计算角度。

你没有说清楚你想要绘制的是什么。如果它只是点本身(文件中每行一个点),那么这可以在 gnuplot 中轻松完成。我展示了 gnuplot 5.5 的输出。在早期版本中,根据您想要绘制的确切内容,可能需要额外的命令在单独的步骤中对数据进行排序,然后绘制排序后的数据。如果您阐明了情节中究竟应该包含什么,我将相应地修改示例。

使用随机 x 和 y 坐标的 100 个点的示例:

set print $RANDOM
do for [i=1:100] { print rand(0)-0.5, rand(0)-0.5 }
unset print

set xrange [-1:1]
set yrange [-1:1]
set angle degrees
set cbrange [-180:180]; set cblabel "Angle"

set style data linespoints
plot $RANDOM using 1:2:(atan2(,)):(atan2(,)) smooth zsort lc palette

更新答案

已修改以显示给定的样本数据图

$DATA << EOD
X       Y       Result
-0.707  -0.707  222
-0.707   0.707  888
 0.707  -0.707  444
-1      0       111
 1      0       555
0.707   0.707   666
 0      1       777
 0      -1      333
EOD

set datafile columnheader       # allow for the line of labels
unset key

# atan2() returns a number between -pi and pi;   convert this to 0 -> 1
# You could make it run from 0->60 if you know in advance
# there will be 60 evenly spaced points
xcoord(a) = (a + pi) / (2 * pi)

plot $DATA using (xcoord(atan2(,))):3:(atan2(,)) smooth zsort with points

实际上,如果您不关心点的绘制顺序,只关心它们结束的位置,命令会更简单,因为不需要排序!

plot $DATA using (xcoord(atan2(,))):3 with points