2014-05-20 36 views
0

我想在一個rgraph中畫兩條線,我假設它是一個調用相同代碼兩次的簡單情況,但是隻有我的第二個圖有時候會畫出來。我的代碼被設計爲從postgres中調用,我已經刪除了sql代碼)試圖在R中畫兩條線

下面的代碼應該在畫布/ tmp/junk上繪製兩行,但我看到的所有內容都是紅線,我曾希望看到紅色和綠色。

create or replace function doit() returns text as 
$$ 

printf <- function(...)print(sprintf(...)) 
png('/tmp/junk.png',width=800,height=500) 

x=seq(0,40) 
x2=seq(0,80,by=2) 
y=seq(0,40) 
opar <-par(bg="white") 
par(new=T) 
yrange=range(y) 
plot(x=x,y=y); 
lines(x=x,y=y,col="green",lty="solid") 
points(x=x,y=y,bg="limegreen",pch=23) 

par(new=F) 
plot(x=x2,y=y); 
points(x=x2,y=y,bg="red",pch=23) 
lines(x=x2,y=y,col="red",lty="solid") 
points(x=x2,y=y,bg="red",pch=23) 

title(main='Example one') 
dev.off() 
print ("done") 
$$ LANGUAGE 'plr'; 

回答

5

也許有些矛盾的是,你要

par(new=T) 

在現有的地塊上圖。由於?par幫助頁面狀態:

如果設置爲TRUE,則下一次高級別繪圖命令(實際上 plot.new)繪製前,應不乾淨框架,就好像它在是 新設備

但是,這真的只是如果你使用plot()第二次。如果你拿出第二個plot以及par(new),並且只留下linespoints調用,那麼這個調用將會在沒有太大麻煩的情況下進行。

唯一的問題是第一張圖的限制一旦被繪製就不會改變,所以如果y2超出y1的範圍,則可能無法正確繪製。所以你可以在plot命令中明確設置ylim=range(y1,y2)

因此,把所有的一起,我會做

png('/tmp/junk.png',width=800,height=500) 

x=seq(0,40) 
x2=seq(0,80,by=2) 
y=seq(0,40) 
y2=seq(0,80,by=2) * .2 
opar <-par(bg="white") 

plot(0,0, type="n", xlim=range(x,x2), ylim=range(y,y2)); 

lines(x=x,y=y,col="green",lty="solid") 
points(x=x,y=y,bg="limegreen",pch=23) 

lines(x=x2,y=y2,col="red",lty="solid") 
points(x=x2,y=y2,bg="red",pch=23) 

title(main='Example one') 
dev.off() 
+0

謝謝!下次我會RTFM一次又一次 – Dave