我试图在一个rgraph中绘制两行,我假设这是一个两次调用相同代码的简单情况,但只有我的第二个图形似乎被绘制。 (我的代码旨在从postgres调用,我删除了sql代码)
下面的代码应该在canvas / 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';
答案 0 :(得分:5)
也许有点自相矛盾,你想要
par(new=T)
在现有情节之上绘图。正如?par
帮助页面所述:
如果设置为TRUE,则为下一个高级绘图命令(实际上是 plot.new)在绘制之前应该不干净框架,就像它一样 在新设备上
但是,如果您第二次使用plot()
,那真的就是这样。如果您取出第二个plot
以及par(new)
,只需离开lines
和points
来电,就可以毫不费力地吸引。
唯一的问题是第一个绘图的极限在绘制后不会改变,因此如果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()