3

不受任何预先存在的 R、Rpy2 和 ggplot2 知识的阻碍,我永远不会更喜欢从 Python 创建一个简单表的散点图。

要进行此设置,我刚刚安装了:

  • Ubuntu 11.10 64 位
  • R version 2.14.2(来自 r-cran 镜子)
  • ggplot2(通过R> install.packages('ggplot2')
  • rpy2-2.2.5(通过easy_install

在此之后,我可以使用 ggplot2 从交互式 R 会话中绘制一些示例数据帧。

但是,当我只是尝试ggplot2按照我在网上找到的示例中看到的那样导入时,我收到以下错误:

from rpy2.robjects.lib import ggplot2
  File ".../rpy2/robjects/lib/ggplot2.py", line 23, in <module>
    class GGPlot(robjects.RObject):
  File ".../rpy2/robjects/lib/ggplot2.py", line 26, in GGPlot
    _rprint = ggplot2_env['print.ggplot']
  File ".../rpy2/robjects/environments.py", line 14, in __getitem__
    res = super(Environment, self).__getitem__(item)
LookupError: 'print.ggplot' not found

谁能告诉我我做错了什么?正如我所说,有问题的导入来自一个在线示例,所以很可能还有其他方式我应该通过 rpy2 使用 gplot2。


作为参考,与上述问题无关,这是我想绘制的数据框示例,一旦我让导入工作(查看示例应该不是问题)。这个想法是创建一个散点图,其中 x 轴上的长度、Y 轴上的百分比和布尔值用于为点着色,然后我想将其保存到文件(图像或 pdf)。鉴于这些要求非常有限,因此也欢迎替代解决方案。

     original.length row.retained percentage.retained
1               1875        FALSE                11.00
2               1143        FALSE                23.00
3                960        FALSE                44.00
4               1302        FALSE                66.00
5               2016        TRUE                 87.00
4

5 回答 5

4

R 包 ggplot2 中的更改破坏了 rpy2 层。尝试使用 bitbucket 上 rpy2 代码的“默认”分支 (rpy2-2.3.0-dev) 的最新(我刚刚修复此问题)快照。

编辑: rpy2-2.3.0 比计划晚了几个月。我刚刚发布了一个错误修复版本 rpy2-2.2.6,它应该可以解决这个问题。

于 2012-04-19T16:08:43.657 回答
2

虽然我无法帮助您修复您看到的导入错误,但这里有一个使用 lattice 的类似示例:lattice with rpy2

此外,标准 Rplot函数通过使用该函数接受着色factor(您可以输入该row.retained列。示例:

plot(original.length, percentage.retained, type="p", col=factor(row.retained))
于 2012-03-05T10:16:09.017 回答
2

根据 fucitol 的回答,我改为使用默认绘图和格子来实现绘图。以下是这两种实现:

from rpy2 import robjects
#Convert to R objects
original_lengths = robjects.IntVector(original_lengths)
percentages_retained = robjects.FloatVector(percentages_retained)
row_retained = robjects.StrVector(row_retained)

#Plot using standard plot
r = robjects.r
r.plot(x=percentages_retained,
       y=original_lengths,
       col=row_retained,
       main='Title',
       xlab='Percentage retained',
       ylab='Original length',
       sub='subtitle',
       pch=18)

#Plot using lattice
from rpy2.robjects import Formula
from rpy2.robjects.packages import importr
lattice = importr('lattice')
formula = Formula('lengths ~ percentages')
formula.getenvironment()['lengths'] = original_lengths
formula.getenvironment()['percentages'] = percentages_retained

p = lattice.xyplot(formula,
                   col=row_retained,
                   main='Title',
                   xlab='Percentage retained',
                   ylab='Original length',
                   sub='subtitle',
                   pch=18)
rprint = robjects.globalenv.get("print")
rprint(p)

很遗憾我无法开始ggplot2工作,因为默认情况下它会生成更好的图表,而且我认为使用数据框更加明确。仍然欢迎这方面的任何帮助!

于 2012-03-05T11:28:43.250 回答
2

如果您没有任何经验,Rpython可以使用numpypandas进行数据分析和matplotlib绘图。

这是一个“感觉如何”的小例子:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 

df = pd.DataFrame({'original_length': [1875, 1143, 960, 1302, 2016],
                   'row_retained': [False, False, False, False, True],
                   'percentage_retained': [11.0, 23.0, 44.0, 66.0, 87.0]})
fig, ax = plt.subplots()
ax.scatter(df.original_length, df.percentage_retained,
           c=np.where(df.row_retained, 'green', 'red'),
           s=np.random.randint(50, 500, 5)
           )   
true_value = df[df.row_retained]
ax.annotate('This one is True',
            xy=(true_value.original_length, true_value.percentage_retained),
            xytext=(0.1, 0.001), textcoords='figure fraction',
            arrowprops=dict(arrowstyle="->"))
ax.grid()
ax.set_xlabel('Original Length')
ax.set_ylabel('Precentage Retained')
ax.margins(0.04)
plt.tight_layout()
plt.savefig('alternative.png')

替代.png

pandas还有一个实验性的 rpy2 接口。

于 2012-04-21T09:55:49.793 回答
1

该问题是由最新的 ggplot2 版本 0.9.0 引起的。此版本没有 ggplot2 版本 0.8.9 中的 print.ggplot() 函数。

我试图修改 rpy2 代码以使其与最新的 ggplot2 一起工作,但更改的范围似乎很大。

同时,只需将您的 ggplot2 版本降级到 0.8.9

于 2012-04-13T11:56:00.430 回答