我想将 pandas 与 numpy 一起用于我的所有分析,但使用 Rpy2 来绘制我的数据。我想使用熊猫数据框进行所有分析,然后通过 rpy2 使用 R 的完整绘图来绘制这些。py2,并且正在使用 ipython 进行绘图。这样做的正确方法是什么?
我尝试的几乎所有命令都失败了。例如:
- 我正在尝试在 pandas DataFrame 的两列之间绘制散点图
df
。我希望df
在 x/y 轴上使用的标签就像在 R 数据帧中使用的那样。有没有办法做到这一点?当我尝试使用 时r.plot
,我得到了这个乱码:
In: r.plot(df.a, df.b) # df is pandas DataFrame
产量:
Out: rpy2.rinterface.NULL
导致情节:
如您所见,轴标签被弄乱了,它没有像应有的那样从 DataFrame 中读取轴标签(X 轴是 column a
of df
,Y 轴是 column b
)。
如果我尝试用 制作直方图
r.hist
,它根本不起作用,产生错误:In: r.hist(df.a) Out: ... vectors.pyc in <genexpr>((x,)) 293 if l < 7: 294 s = '[' + \ --> 295 ', '.join((p_str(x, max_width = math.floor(52 / l)) for x in self[ : 8])) +\ 296 ']' 297 else: vectors.pyc in p_str(x, max_width) 287 res = x 288 else: --> 289 res = "%s..." % (str(x[ : (max_width - 3)])) 290 return res 291 TypeError: slice indices must be integers or None or have an __index__ method
并导致了这个情节:
知道错误是什么意思吗?再次在这里,轴都被弄乱了,到处都是乱七八糟的数据。
编辑:此错误仅在使用 ipython 时发生。当我从脚本运行命令时,它仍然会产生有问题的情节,但至少运行时没有错误。从 ipython 调用这些命令一定有问题。
我还尝试按照
df
下面海报的建议将 pandas DataFrame 转换为 R DataFrame,但这也因此错误而失败:com.convert_to_r_dataframe(mydf) # mydf is a pandas DataFrame ----> 1 com.convert_to_r_dataframe(mydf) in convert_to_r_dataframe(df, strings_as_factors) 275 # FIXME: This doesn't handle MultiIndex 276 --> 277 for column in df: 278 value = df[column] 279 value_type = value.dtype.type TypeError: iteration over non-sequence
如何让这些基本绘图功能在 Pandas DataFrame 上工作(从 Pandas DataFrame 的标签中读取绘图标签),并让 Pandas DF 到 R DF 之间的转换工作?
EDIT2:这是一个完整的 csv 文件“test.txt”(http://pastebin.ca/2311928)示例和我回答@dale 评论的代码:
import rpy2
from rpy2.robjects import r
import rpy2.robjects.numpy2ri
import pandas.rpy.common as com
from rpy2.robjects.packages import importr
from rpy2.robjects.lib import grid
from rpy2.robjects.lib import ggplot2
rpy2.robjects.numpy2ri.activate()
from numpy import *
import scipy
# load up pandas df
import pandas
data = pandas.read_table("./test.txt")
# plotting a column fails
print "data.c2: ", data.c2
r.plot(data.c2)
# Conversion and then plotting also fails
r_df = com.convert_to_r_dataframe(data)
r.plot(r_df)
绘制“data.c2”列的调用失败,即使 data.c2 是 pandas df 的列,因此出于所有意图和目的应该是一个 numpy 数组。我使用了这个activate()
调用,所以我认为它会将此列作为一个 numpy 数组处理并绘制它。
data
转换为 R 数据帧后绘制数据帧的第二次调用也失败。这是为什么?如果我test.txt
从 R 作为数据框加载,我可以这样plot()
做,并且由于我的数据框已从 pandas 转换为 R,它似乎也应该在这里工作。
当我rmagic
在 ipython 中尝试时,由于某种原因它不会启动绘图窗口,尽管它不会出错。即如果我这样做:
In [12]: X = np.array([0,1,2,3,4])
In [13]: Y = np.array([3,5,4,6,7])
In [14]: import rpy2
In [15]: from rpy2.robjects import r
In [16]: import rpy2.robjects.numpy2ri
In [17]: import pandas.rpy.common as com
In [18]: from rpy2.robjects.packages import importr
In [19]: from rpy2.robjects.lib import grid
In [20]: from rpy2.robjects.lib import ggplot2
In [21]: rpy2.robjects.numpy2ri.activate()
In [22]: from numpy import *
In [23]: import scipy
In [24]: r.assign("x", X)
Out[24]:
<Array - Python:0x592ad88 / R:0x6110850>
[ 0, 1, 2, 3, 4]
In [25]: r.assign("y", Y)
<Array - Python:0x592f5f0 / R:0x61109b8>
[ 3, 5, 4, 6, 7]
In [27]: %R plot(x,y)
没有错误,但也没有绘图窗口。无论如何,我想坚持使用 rpy2 并且rmagic
尽可能不依赖。
谢谢。