3

私はrpy2-2.0.7を使用しています(これはWindows 7で動作するために必要であり、新しいrpy2バージョンのバイナリをコンパイルするのは面倒です)2列のデータフレームをrにプッシュし、ggplot2にいくつかのレイヤーを作成して出力します画像を<.png>に変換します。

私は構文をいじくり回して数え切れないほどの時間を無駄にしてきました。ある時点で必要なファイルを出力することができましたが、(ばかげて)気づかず、コードをいじり続けました...

助けていただければ幸いです。以下は、デモンストレーションの(簡単な)例です。ご助力ありがとうございます!!!〜エリックバター


import rpy2.robjects as rob
from rpy2.robjects import r
import rpy2.rlike.container as rlc
from array import array

r.library("grDevices")    # import r graphics package with rpy2
r.library("lattice")
r.library("ggplot2")
r.library("reshape")

picpath = 'foo.png' 

d1 = ["cat","dog","mouse"]
d2 = array('f',[1.0,2.0,3.0])

nums = rob.RVector(d2)
name = rob.StrVector(d1)

tl = rlc.TaggedList([nums, name], tags = ('nums', 'name'))
dataf = rob.RDataFrame(tl)

## r['png'](file=picpath, width=300, height=300)
## r['ggplot'](data=dataf)+r['aes_string'](x='nums')+r['geom_bar'](fill='name')+r['stat_bin'](binwidth=0.1)
r['ggplot'](data=dataf)
r['aes_string'](x='nums')
r['geom_bar'](fill='name')
r['stat_bin'](binwidth=0.1)
r['ggsave']()
## r['dev.off']()

*出力は単なる空白の画像です(181b)。


ここに、ggplot2をいじるときにR自体がスローするいくつかの一般的なエラーがあります。

r['png'](file=picpath, width=300, height=300)
r['ggplot']()
r['layer'](dataf, x=nums, fill=name, geom="bar")
r['geom_histogram']()
r['stat_bin'](binwidth=0.1)
r['ggsave'](file=picpath)
r['dev.off']()

* RRuntimeError:エラー:プロットにレイヤーがありません

r['png'](file=picpath, width=300, height=300)
r['ggplot'](data=dataf)
r['aes'](geom="bar")
r['geom_bar'](x=nums, fill=name)
r['stat_bin'](binwidth=0.1)
r['ggsave'](file=picpath)
r['dev.off']()

* RRuntimeError:エラー:美学を設定するとき、それらは1つの値しかとらない場合があります。問題:fill、x

4

3 に答える 3

3

私はrnumpyと呼ばれるNathanielSmithの素晴らしい小さなモジュールを介してのみrpy2を使用します( rnumpyホームページの「API」リンクを参照してください)。これであなたはすることができます:

from rnumpy import *

r.library("ggplot2")

picpath = 'foo.png' 
name = ["cat","dog","mouse"]
nums = [1.0,2.0,3.0]

r["dataf"] = r.data_frame(name=name, nums=nums)
r("p <- ggplot(dataf, aes(name, nums, fill=name)) + geom_bar(stat='identity')")
r.ggsave(picpath)

(私はあなたがプロットをどのように見せたいかについて少し推測していますが、あなたはその考えを理解しています。)

もう1つの非常に便利なのは、ipy_rnumpyモジュールを使用してPythonから「Rモード」に入る方法です。(rnumpyホームページの「IPython統合」リンクを参照してください)。

複雑なものについては、プロットコマンドが機能するまで、通常はRでプロトタイプを作成します。rpy2またはrnumpyでのエラー報告は、かなり厄介になる可能性があります。

たとえば、割り当て(または他の計算)の結果は、非表示にする必要がある場合でも出力されることがあります。これは、たとえば大きなデータフレームに割り当てる場合に煩わしいものです。簡単な回避策は、問題のある行を、短いものと評価される末尾のステートメントで終了することです。例えば:

In [59] R> long <- 1:20
Out[59] R>
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
 [19]  19  20

In [60] R> long <- 1:100; 0
Out[60] R> [1] 0

(rnumpyで繰り返し発生する警告をすべて消音するために、rnumpy.pyを編集して、警告から'import warn'を追加し、'print "error in process_revents:ignored"'を'warn( "error in process_revents:ignored")'に置き換えました。そうすれば、警告はセッションごとに1回だけ表示されます。)

于 2010-11-26T14:58:04.320 に答える
2

シャットオフする前にdev()を使用する必要があります。つまり、dev.off()をスローする前に(上記のJDの推測のように)print()を実行する必要があります。

from rpy2 import robjects                          
r = robjects.r                                                                                    
r.library("ggplot2")
robjects.r('p = ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()') 
r.ggsave('/stackBar.jpeg') 
robjects.r('print(p)')
r['dev.off']()
于 2011-01-21T22:51:09.180 に答える
1

より複雑なプロットを描画する必要がある場合に、少し簡単にするには:

from rpy2 import robjects
from rpy2.robjects.packages import importr
import rpy2.robjects.lib.ggplot2 as ggplot2
r = robjects.r
grdevices = importr('grDevices')
p = r('''
  library(ggplot2)

  p <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
  p <- p + opts(title = "{0}")
    # add more R code if necessary e.g. p <- p + layer(..)
  p'''.format("stackbar")) 
  # you can use format to transfer variables into R
  # use var.r_repr() in case it involves a robject like a vector or data.frame
p.plot()
# grdevices.dev_off()
于 2011-02-17T10:58:05.120 に答える