1

我已经用 Sage 和 R 进行了一些数据分析,此时我想制作一组漂亮的图来浓缩结果,以便我可以正确地呈现它们。

我所做的是在下拉菜单中将整个笔记本设置为 R。然后我在多个单元格中执行一些代码。效果很好。我有代码的最大单元格填满了我的大部分屏幕(五个大型 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 选择单元格的代码比绘图单元格的代码多得多。所以我想知道是否可能存在某种超时使 Sage 停止等待 PNG 输出?我也尝试在硬盘驱动器中搜索“temp.png”,但没有任何显示。

您可以将多少数据传递给 Sage 中的绘图是否有限制?我可以以某种方式调整它吗?或者我可以进入某种调试模式以更好地理解为什么当我将所有四个图都添加到输出时什么都没有发生?

4

2 回答 2

1

为了完整起见,我的答案的简短版本:

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

eval_using_file_cutoff=1024)

使用您想要的字符数的截止值。(您必须./sage -b在重新启动服务器之前执行此操作。)如果您不这样做,您将无法使用下拉菜单直接解决此问题,尽管r.eval()在普通 Sage 菜单中使用一些额外选项应该可以做到这一点.

于 2013-05-22T12:41:49.773 回答
0

正如 kcrisman 在他的回答中所建议的那样,无需更改任何 r.py 代码。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 个字符的极少数情况,因此我仅将其作为一个特殊单元格单独完成。

于 2013-05-23T04:56:59.433 回答