1

私は Sage と R を使用していくつかのデータ分析を行いました。この時点で、結果を適切に提示できるように、結果を要約するための優れた一連のプロットを作成したいと考えています。

私が行ったことは、ドロップダウン メニューでノートブック全体を R に設定することです。次に、いくつかのセルでいくつかのコードを実行します。よく働く。コードを含む最大のセルが画面の大部分を占めています (データベースからデータを取得して変数に格納するための 5 つの大きな SQL 選択)。そのため、一部のコードでは、まったく制限がないように見えます。

今、私はプロットをやっています。まず、次の 2 行でキャンバスを取得します。

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

次に、同じ PNG 内に 4 つのプロットを取得して、うまく圧縮できるようにしたいと考えています。しかし、Sage は 4 つのプロットすべてでプロット結果を表示することを拒否しています。最初の 2 つのプロットがあるだけでうまくいきます (下部に 2 つの空白スペースがあります)。最初の 2 つのプロット、または中間の 2 つのプロット、または最後の 2 つのプロット、または最初と最後のプロットの両方がうまく機能します。しかし、3 つのプロットは機能せず、4 つのプロットも機能しません。

そこで、次のように、もっと単純なことを試しました。

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()

このコードはうまく機能し、4 つの単純なプロットが得られます。そして、それを拡張して、実際にこのようにプロットして機能させようとしているものに近づけることもできます。

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()

ここで何が問題なのですか?各プロットは単独では問題なく動作するように見え、ペアで配置すると出力されるのに、4 つすべてで試しても表示されないのはなぜですか? ところで、smoothScatter() の代わりに plot() も試してみましたが、同じです。2 つのプロットを表示しますが、それ以上は表示しません。par(mfrow=c(4,1)) も試しましたが、違いはありませんでした。

最初は、1 つのセルに入れることができる R コードの量に制限があると思っていましたが、私の SQL-select-cells にはプロット セルよりもはるかに多くのコードがあります。それで、Sage が PNG 出力の待機を停止する何らかのタイムアウトがあるのではないかと考えています。ハードドライブで「temp.png」も検索してみましたが、何も表示されません。

Sage でプロットに渡すことができるデータの量に制限はありますか? これをどうにか調整できませんか?または、出力に 4 つのプロットすべてを追加しても何も起こらない理由をよりよく理解するために、何らかのデバッグ モードに入ることができますか?

4

2 に答える 2

0

kcrisman が回答で提案したように、r.py コードを変更する必要はありません。R コードは常に実行されますが、コードが 1024 文字を超える場合、R コードはコマンド ラインとしてではなくスクリプト ファイルとして実行され、Sage は生成された出力の検出に失敗します。

私が見つけた回避策は、長いコード スニペットからの出力を既知のファイルに保存することです。たとえば、プロットの場合は "~/temp.png" です。次に、次のセルを使用してダミー プロットを描画し、以前に作成したプロットをキャンバスに書き込みます。このプロットは短いコード (1024 文字未満) から生成されるため、Sage は 2 回目に生成された出力を検出できます。使用したコードは次のとおりです。

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 に答える