2011-01-27 205 views
6

我在模擬中生成了數據。所生成的數據文件看起來是這樣的:用gnuplot繪製箭頭

1990/01/01 99 
1990/01/02 92.7 
1990/01/03 100.3 
1990/01/04 44.2 
1990/01/05 71.23 
... 
2100/01/01 98.25 

我可以創建一個圖表(平凡),通過簡單地發出(長版本)命令:

plot "simulation.dat" using 1:2 with line 

我想添加第三列其中會添加箭頭信息。將第三列的編碼將是如下:

  • 0 =>要被繪製爲使得x軸的值沒有箭頭
  • 1 =>要被繪製爲x軸值的指向上方的箭頭
  • 2 =>要繪製爲x軸值

我剛開始學習的gnuplot一個向下的箭頭,並會欣賞我如何使用的gnuplot創建第一個情節的箭頭幫助?

+0

嗨,我想我得到了你的gnuplot問題工作(至少在linux上)我更新了我的答案。 – Tom 2011-01-27 15:40:37

回答

3

我不認爲有一種自動方式可以基於第三列同時創建所有箭頭。你將不得不執行對您希望每個箭頭下面:

set arrow xval1,yval1 to xval2,yval2 

您也可以使用相對箭頭

set arrow xval1,yval1 rto 1,0 

這將吸引來自xval1橫向箭頭,yval1到(xval1 + 1) ,yval1

plenty of options associated with the set arrow command

3

如果你不想箭頭頭,那麼你可以嘗試的衝動風格(與衝動,而不是用線) (如果你仍然想在最上面的線,那麼你可以繪製兩次)。

如果您確實需要箭頭,那麼以下幾點可能會有所幫助:它使用for循環(或排序)將垂直箭頭添加到繪圖。

Gnuplot script, for loop within or adding to existing plot

具體做法是:

創建一個文件simloop.gp它看起來像下面這樣:

count = count+1 
#save the count to count.gp 
system 'echo '.count.' > count.gp' 
#load the simloop shell 
system "./simloop.sh" 

#draw the arrow 
load 'draw_arrow.gp' 

if(count<max) reread 

然後創建一個simloop.sh文件,看起來像這樣

#!/bin/bash 

#read the count 
count=$(awk -F, '{print $1}' count.gp) 
#read the file 
xcoord=$(awk -v count=$count -F, 'BEGIN{FS=" ";}{ if(NR==count) print $1}' simulation.dat) 
ycoord=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $2}' simulation.dat) 
dir=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $3}' simulation.dat) 

#choose the direction of the arrow 
if [ \"$dir\" == \"0\" ]; then 
    echo '' > draw_arrow.gp 
fi 

if [ \"$dir\" == \"1\" ]; then 
    echo 'set arrow from ' $xcoord' ,0 to '$xcoord','$ycoord' head' > draw_arrow.gp 
fi 

if [ \"$dir\" == \"2\" ]; then 
echo 'set arrow from '$xcoord',0 to '$xcoord','$ycoord' backhead' > draw_arrow.gp 
fi 

然後創建一個看起來如此的simulation.gp文件方法如下:

count = 0; 
max = 5; 
load "simloop.gp" 
set yrange[0:*] 
plot "simulation.dat" u 1:2 w l 

確保shell文件具有可執行權限(chmod + wrx simloop。SH),加載了gnuplot的,並鍵入

load "./simulation.gp" 

這爲我工作與數據文件

1 99 0 
2 92.7 1 
3 100.3 2 
4 44.2 0 
5 71.23 1 

(爲了測試我擺脫了時間格式化你應該能夠把它放回去,沒有太多比較麻煩)

然後我得到這個圖:enter image description here

我認爲這或多或少你想要什麼。

+0

做得很好,我總是從其他代碼中調用gnuplot,所以我沒有意識到這樣的腳本文件不是太複雜。不過,我認爲如果您自己生成輸入文件,可能最容易在代碼中同時繪製箭頭。如果不是這個解決方案是完美 – Martin 2011-01-27 16:46:42

1

雖然這個問題已經很陳舊了,但這是我的答案。

人們可以使用vectors繪圖風格,可以使用基於列的值變量arrowstyles:

set style arrow 1 backhead 
set style arrow 2 head 
set yrange[0:*] 
set xdata time 
set timefmt "%Y/%m/%d" 
plot "simulation.dat" using 1:2 with line,\ 
    "" using 1:2:(0):(-$2):($3 == 0 ? 1/0 : $3) with vectors arrowstyle variable 

這列的值是1/0,該點被認爲是不確定的和被跳過。