我正在使用rpy2-2.0.7(我需要它与windows 7一起工作,并且为较新的rpy2版本编译二进制文件是一团乱麻)将一个两列数据帧推送到r中,在ggplot2中创建几层,并将图像输出到a。
我已经浪费了无数个小时在语法上烦躁不安;我曾经设法输出了我需要的文件,但是(愚蠢地)没有注意到并且继续在我的代码上烦躁不安。。。
我将真诚地感谢任何帮助;下面是一个(微不足道的)示范例子非常感谢你的帮助!!! ~eric黄油

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

*错误:错误:绘图中没有图层
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']()

*错误:当设置美学时,它们只能取一个值。问题:填充,X

最佳答案

我只通过Nathaniel Smith的出色的小模块rnumpy使用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)

(我猜你想让情节看起来怎么样,但你知道了。)
另一个极大的便利是使用ipy_mpy模块从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以添加“from warnings import warn”,并将“print”error in process\u revents:ignored”替换为“warn(“error in process\u revents:ignored”)。这样,每次会话我只看到一次警告。)

10-08 12:54