2015-04-21 37 views
0

我有一個文件包含3列中的數據。第一列包含x座標,第三列包含y座標。第二列包含值(作爲示例,假定它具有來自集合{0, 1, 2}的值),取決於哪一個,繪製點的顏色和類型是決定的。我使用以下命令來進行繪圖:如何在gnuplot中繪製一個基於測試條件的文件和y座標的x座標?

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

'yi'是從'yi'確定的嗎? –

+0

@Tom Fenech,'Yi'可以通過一些簡單的計算從'yi'派生出來,或者它可以是一個常數。就像,如果文件中的值是(5,0,73),(6,1,78),(7,2,84),我想選擇'Yi'作爲80(常數)或者最近的10的倍數,對於每個'yi'。 – jsp99

+0

根據你的評論,你似乎認爲這些線條被分成三份 - 是這種情況嗎?如果是這樣,你想要使用一個基於平均值的數字四捨五入到最接近的10(或類似的東西),事情會變得更復雜一點。如果您只是想將數字舍入到最接近的10,那很容易。請[編輯]你的問題來澄清。顯示一些示例數據總是有用的。 –

回答

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,這意味着數據點被跳過。

如果你想繪製一個完全不同的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' 

和以前一樣,當第二列不匹配的行被跳過要求的價值。我還添加了一個條件,當第一列和第三列匹配變量xy時,將使用值Y而不是第三列。

要根據當前值y執行計算,可以使用函數f(y)而不是變量Y。例如,要輪10的最接近的值,你可以聲明此功能:

f(y) = round(y/10) * 10 

然後用f($3)替換Y

順便說一句,一個awk程序的結構爲condition { action },默認動作是{ print }所以如果你打算用awk,可以簡化爲awk '$2 == 0'(這也是不必要引述0)。

+0

謝謝你的優雅的答案。你能告訴我,是否有一種簡單的方法可以用'$ 3'做一些'小'計算並獲得'Y'的值?像'Y = nearest_multiple_of_ten(y)'或'Y = y-y | mod 10 |'。 – jsp99

+0

@ jsp99編輯顯示一個功能的例子。希望有所幫助。 –

+0

該問題的最優雅的解決方案。謝謝。 – jsp99

相關問題