试图在R中绘制两条线

Dav*_*ave 0 plot r

我试图在一个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';
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 5

也许有点自相矛盾,你想要

par(new=T)
Run Code Online (Sandbox Code Playgroud)

绘制在现有情节之上.如?par帮助页面所述:

如果设置为TRUE,则下一个高级绘图命令(实际上是plot.new)不应该在绘制之前清除帧,就好像它在设备上一样

但这真的只是你plot()第二次使用.如果你拿出那一秒plot以及par(new)只是离开lines并且points通话,这将在没有太多麻烦的情况下绘制.

唯一的问题是第一个绘图的限制一旦被绘制就不会改变,所以如果y2超出范围y1,它可能无法正确绘制.所以你可以ylim=range(y1,y2)在plot命令中明确设置.

所以,把这一切放在一起,我会这样做

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()
Run Code Online (Sandbox Code Playgroud)