在Sage中进行R图时是否有限制?

时间:2013-05-22 07:15:23

标签: r plot sage

我已经用Sage和R做了一些数据分析,此时我想制作一套很好的图表来压缩结果,以便我能正确地呈现它们。

我所做的是将整个笔记本设置为R,在下拉菜单中。然后我在许多单元格中执行一些代码。效果很好。代码为I的最大单元格填满了我的大部分屏幕(五个大型SQL选择从数据库中提取数据并存储在变量中)。因此,对于某些代码,似乎没有任何限制。

现在我在做密谋。我从这两行开始,得到一个画布:

png("temp.png", width=1800, height=1000)
par(mfrow=c(2,2))

然后我想在同一个PNG中得到四个图,这样它就可以很好地压缩在一起了。但是Sage拒绝透露所有四个情节的任何情节结果。只有前两个图很好(我在底部有两个空格)。两个第一块地块都很好,或两个中间地块,或两个最后一块,或第一块和最后一块。但是三个地块不起作用,也没有四个。

所以我尝试了一些更简单的东西,比如:

png("temp.png", width=1800, height=1000)
par(mfrow=c(2,2))
plot(1:20)
plot(20:1)
plot(seq(5,15,0.5))
plot(seq(15,5,-0.5))
dev.off()

这段代码效果很好,我得到了四个简单的图。我甚至可以将其扩展为更像我实际上想要绘制的内容并使其工作:

png("temp.png", width=1800, height=1000)
par(mfrow=c(2,2))
plot(1:20)
lines(c(0,500),c(0,0), lwd=1, col="Black", xlab="", ylab="")
par(new=T)
plot(data.frame(seq(0,20), seq(0,20)), type="l", lwd=2, col="Red", axes=F, xlab="", ylab="")
plot(20:1)
lines(c(0,500),c(0,0), lwd=1, col="Black", xlab="", ylab="")
par(new=T)
plot(data.frame(seq(0,20), seq(0,20)), type="l", lwd=2, col="Red", axes=F, xlab="", ylab="")
plot(seq(5,15,0.5))
lines(c(0,500),c(0,0), lwd=1, col="Black", xlab="", ylab="")
par(new=T)
plot(data.frame(seq(0,20), seq(0,20)), type="l", lwd=2, col="Red", axes=F, xlab="", ylab="")
plot(seq(15,5,-0.5))
lines(c(0,500),c(0,0), lwd=1, col="Black", xlab="", ylab="")
par(new=T)
plot(data.frame(seq(0,20), seq(0,20)), type="l", lwd=2, col="Red", axes=F, xlab="", ylab="")
dev.off()

到目前为止一切顺利。在我看来,就像我想要展示我的数据应该如何运作一样。但我的实际代码不起作用。这是我在实际绘图单元格中的样子(没有显示):

png("temp.png", width=1800, height=1000)
par(mfrow=c(2,2))
smoothScatter(WFr, colramp=colorRampPalette(c("white", "black")), xlab="Julian day", ylab="Residual", xlim=c(175,279), ylim=c(-0.3,0.3), main="Wild Females, model residuals over time")
lines(c(0,500),c(0,0), lwd=1, col="Black", xlab="", ylab="", xlim=c(175,279), ylim=c(-0.3,0.3))
par(new=T)
plot(data.frame(seq(100,299), WFrlm$coef[1]+WFrlm$coef[2]*seq(100,299)), type="l", lwd=2, col="Red", axes=F, xlab="", ylab="", xlim=c(175,279), ylim=c(-0.3,0.3))
smoothScatter(WMr, colramp=colorRampPalette(c("white", "black")), xlab="Julian day", ylab="Residual", xlim=c(175,279), ylim=c(-0.3,0.3), main="Wild Males, model residuals over time")
lines(c(0,500),c(0,0), lwd=1, col="Black", xlab="", ylab="", xlim=c(175,279), ylim=c(-0.3,0.3))
par(new=T)
plot(data.frame(seq(100,299), WMrlm$coef[1]+WMrlm$coef[2]*seq(100,299)), type="l", lwd=2, col="Red", axes=F, xlab="", ylab="", xlim=c(175,279), ylim=c(-0.3,0.3))
smoothScatter(CFr, colramp=colorRampPalette(c("white", "black")), xlab="Julian day", ylab="Residual", xlim=c(175,279), ylim=c(-0.3,0.3), main="Cultured Females, model residuals over time")
lines(c(0,500),c(0,0), lwd=1, col="Black", xlab="", ylab="", xlim=c(175,279), ylim=c(-0.3,0.3))
par(new=T)
plot(data.frame(seq(100,299), CFrlm$coef[1]+CFrlm$coef[2]*seq(100,299)), type="l", lwd=2, col="Red", axes=F, xlab="", ylab="", xlim=c(175,279), ylim=c(-0.3,0.3))
smoothScatter(CMr, colramp=colorRampPalette(c("white", "black")), xlab="Julian day", ylab="Residual", xlim=c(175,279), ylim=c(-0.3,0.3), main="Cultured Males, model residuals over time")
lines(c(0,500),c(0,0), lwd=1, col="Black", xlab="", ylab="", xlim=c(175,279), ylim=c(-0.3,0.3))
par(new=T)
plot(data.frame(seq(100,299), CMrlm$coef[1]+CMrlm$coef[2]*seq(100,299)), type="l", lwd=2, col="Red", axes=F, xlab="", ylab="", xlim=c(175,279), ylim=c(-0.3,0.3))
dev.off()

这里有什么问题?由于每个图表本身都可以正常工作,并且当我将它们成对出现时它们会打印出来,为什么当我尝试使用它们时它们不会出现?顺便说一句,我也尝试过plot()而不是smoothScatter(),它是一样的;显示2个图但不是更多。我也试过par(mfrow = c(4,1)),但没有区别。

起初我认为你可以在一个单元格中放入多少R代码是有限制的,但是我的SQL-select-cells比绘图单元格有更多的代码。所以我想知道是否有某种超时让Sage停止等待PNG输出?我试着在我的硬盘上搜索“temp.png”,但我没有看到任何东西。

对于您可以传递给Sage中的地块的数据有限制吗?我能以某种方式调整吗?或者我可以输入某种调试模式,以便更好地理解为什么在将所有四个图添加到输出时没有发生任何事情?

2 个答案:

答案 0 :(得分:1)

my answer there的简短版本,为了完整性:

如果您有自己的安装,那么在devel / sage / sage / interfaces / r.py中,替换

eval_using_file_cutoff=1024)

根据字符数量你想要的截止值。 (在重新启动服务器之前,您必须执行./sage -b。)如果不这样做,您将无法使用下拉菜单直接解决此问题,尽管在{0}中使用了r.eval()正常的Sage菜单应该有一些额外的选项。

答案 1 :(得分:0)

没有必要更改任何r.py代码,正如kcrisman在他的回答中所建议的那样。 R代码总是运行,但是当代码长度超过1024个字符时,R代码作为脚本文件而不是命令行运行,然后Sage无法检测到生成的任何输出。

我找到的解决方法是将长代码段的输出保存到已知文件中,例如情节的“〜/ temp.png”。然后,您可以使用下一个单元格绘制虚拟绘图,然后将先前创建的绘图写入画布。由于此图是由较短的代码(少于1024个字符)生成的,因此Sage将能够检测第二次生成的输出。这是我使用的代码:

png("~/output.png", width=1800, height=1000)
par(mfrow=c(2,2))
# do fancy plot stuff here
dev.off()
# <---- I used a second cell here ---->
library(png)
x <- readPNG("~/output.png")
png("tmp.png", width=1800, height=1000)
plot(1:2, type="n", axes=F, xlab="", ylab="")
# rasterImage() prints on the plot. The plot goes from x = c(1,2) to y = c(1,2).
# So we tell rasterImage() to print within that x/y (i.e. "1,1,2,2") to keep
# the plot scaled correctly.
rasterImage(x, 1, 1, 2, 2)
dev.off()

你当然可以像功能或其他东西那样做。但由于它只适用于极少数情况下,当绘图参数太长以至于代码长度超过1024个字符时,我只能将它作为一个特殊的单元格来完成。