我想在 gnuplot 中繪制所有位于一個圓圈上的結果。對于每個值,我都有相應的 xy 坐標和相應的 ID 號(總共 4 列),但未排序。行將按照旋轉方向從 -x => -y => x => y 到 -x 的方式排序。所以圓的中心是0。如何用“sort”(或者用“awk”?)命令(使用Linux)來實作這個?
在 Theozh 的建議下,我將更準確地表述我的問題。想象一個帶有小點作為分鐘符號的時鐘表盤。微小點的位置可以由極坐標或笛卡爾坐標確定。我的檔案包含帶有關聯值(結果)的笛卡爾坐標。該檔案包含 60 行 x - y 坐標,結果位于第三列。當然,根據象限,x 和 y 的符號會發生變化。不幸的是,這些線條沒有按照與流通感相對應的方式進行排序。所以“第 30 分鐘”點的線不在第 30 行,而是在第 17 行。任務是按坐標對線進行排序,使它們按從 1 到 60 的順序出現。在圖中,
我未排序的檔案(單位圓的坐標,簡化的結果值以獲得更好的概覽)

這就是我想要的(8行(每45°)逆時針排序):

uj5u.com熱心網友回復:
可以使用 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($2,$1)):(atan2($2,$1)) 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($2,$1))):3:(atan2($2,$1)) smooth zsort with points
實際上,如果您不關心點的繪制順序,只關心它們最終的位置,那么命令就更簡單了,因為不需要排序!
plot $DATA using (xcoord(atan2($2,$1))):3 with points

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/482230.html
