我正在使用rpy2-2.0.7(我需要使用它来处理Windows 7,并为新的rpy2版本编译二进制文件是一团糟)将两列数据帧推入r,在ggplot2中创建几个层,并输出将图像转换为< .png>.
我浪费了无数个小时来熟悉语法;我确实设法输出了我需要的文件,但是(愚蠢地)没有注意到并继续烦恼我的代码……
我真诚地感谢任何帮助;下面是一个(平凡的)示例示例.非常感谢您的帮助!!! ~Erican Butter
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']()
*输出只是一个空白图像(181 b).
这里有一些常见的错误,当我在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:错误:设置美学时,它们可能只取一个值.问题:填充,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_rnumpy模块从Python进入“R模式”. (请参阅rnumpy主页上的“IPython集成”链接).
对于复杂的东西,我通常在R中进行原型设计,直到我完成了绘图命令.在rpy2或rnumpy中报告错误可能会非常混乱.
例如,有时会打印分配(或其他计算)的结果,即使它应该是不可见的.这很烦人,例如分配给大数据帧时.一个快速的解决方法是使用一个评估为short的尾随语句来结束违规行.例如:
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’并在process_revents中替换’print’错误:忽略“’带’warn(”process_revents中的错误:忽略“)”.这样,我每次只会看到一次警告.)