Python和Rpy2:调用带有“.”选项的绘图函数
我刚开始学习如何在 Python 中使用 rpy2。现在我能做一些简单的图表,但遇到了一个问题,就是很多 R 的选项里用到了“.”这个符号。比如,下面这个 R 的调用是可以正常工作的:
barplot(t, col=heat.colors(2), names.arg=c("pwn", "pwn2"))
这里的 t 是一个矩阵。
我想在 Python 中用同样的调用,但它不接受 names.arg 中的“.”部分。我原本以为在 Python 中可以把“.”替换成“_”,比如改成 names_arg,但这样也不行。我知道这个问题很基础,希望有人见过这个问题并能告诉我解决办法。谢谢!
3 个回答
0
在使用 rpy2-2.1.0 的时候,有一种写法是这样的:
from rpy2.robjects.packages import importr
graphics = importr("graphics")
grdevices = importr("grDevices")
graphics.barplot_default(t,
col = grdevices.heat_colors(2),
names_arg = StrVector(("pwn", "pwn2")))
之所以需要用 barplot_default 而不是 barplot,是因为 R 语言的函数定义中经常使用省略号 '...',而且要把参数名称进行翻译,就需要分析函数内部的 R 代码。
此外,还有一个示例函数可以帮助你把 '.' 转换成 '_',你可以在这里找到更多信息: http://rpy.sourceforge.net/rpy2/doc-2.1/html/robjects.html#functions
1
我不确定Rpy是否会接受这个,不过你可以使用带有点的关键字参数。不过,你需要通过一个字典来传递它们。就像这样:
>>> def f(**kwds): print kwds
...
>>> f(a=5, b_c=6)
{'a': 5, 'b_c': 6}
>>> f(a=5, b.c=6)
Traceback ( File "<interactive input>", line 1
SyntaxError: keyword cant be an expression (<interactive input>, line 1)
>>> f(**{'a': 5, 'b.c': 6})
{'a': 5, 'b.c': 6}
9
在这里,你可以使用字典来传递命名参数(通过使用 **),就像文档中描述的那样,直接调用R的函数。同时要记住,RPy2需要使用它自己的向量对象。是的,这样做有点麻烦,但好处是,你在rpy2中可以做任何在R中能做的事情。
from rpy2 import robjects
color = robjects.r("heat.colors")()
names = robjects.StrVector(("pwn", "pwn2"))
robjects.r.barplot(t, col=color, **{"names.arg":names})
(注意,这适用于rpy2版本2.0.x;在未发布的2.1版本中有一些变化,我还没有机会去了解。)