想在Python中用R的初衷
从本科到硕士一直都用R,去年工作后才开始用Python。平时大部分工作中都是用Python。偶尔会怀念一些R特有的功能。比如:
-
ggplot
: 年初在研究怎么在Python里面用R的一个主要原因就是想用ggplot,个人使用习惯的问题,和matplotlib比起来更喜欢用ggplot。当时看到Python里有个ggplot package, 不过当时这个package已经很久没有更新了。而且documentation也不全,哪些function能用哪些不能用也不是很清楚。所以就放弃了这个选项。现在又看了一下,好像作者在今年4月份又重开了一个repo来写这个package。试用了一下,会有些bug。感觉还是不是很成熟的样子。所以现在简单一点的图直接用seaborn
,复杂一点的就还是call R用ggplot画 - 因为R毕竟主要是统计学家在搞,所以很注重model的解释性。因此很多model output都把很多信息很干净整洁的display出来。比如最简单的
lm
, summary output 把 coefficients, p-values, R2 等等都很整洁的一次性列出来了, 但在Python的 scikit-learn package 中则很难做到。
使用前需要安装什么
In Python:
rpy2
pip install rpy2
In R:
install.packages('RJSONIO')
install.packages('httr')
但是装的时候在网上查资料说要在R装以上两个packages才能在IPython Notebook里面用R,不过不知道为什么我的电脑只成功安装了第二个,即使如此也能正常在notebook里用R。
Notes:
在更新到新的 El capitan之后R 的root directory有些问题。不能在command line execute. 解决方法就是重装R。
Optional:
如果想要打开一个窗口在里面画图的话 mac OSX 需要安装X11.
如何在Python中使用R
以下是我根据网上搜的资料按工作需要折腾出来的模板~
模板1
使用情况:不需要在单独窗口plot出来,直接将图片存档。
import pandas as pd
import psycopg2
from rpy2 import robjects
from rpy2.robjects import pandas2ri
R = robjects.r
pandas2ri.activate() # 这行很重要,有了这行之后所有的pandas dataframe都不用再手动转换到R里了。
# 读取数据,平时工作一般用psycopg2来从数据库抓数据。
SQL = """ """
with psycopg2.connect(DSN_HDD) as conn:
data = pd.read_sql(SQL, conn, params={'autocommit':True})
# 用来画图的 R code
R_script = """
library(ggplot2)
function(data){
gp = ggplot(data, aes(x=my_x, y=my_y, fill=my_category)) +
geom_bar(stat='identity', position='stack') +
geom_text(aes(label=label_string, y=label_y_position), size=5) +
theme_gray(base_size = 20)
ggsave(filename='test.png', plot=gp, width=18, height=10, unit='in')
}
"""
r_plot = R(R_script)
r_plot(data)
模板2
使用情况:需要在单独窗口plot出来
import pandas as pd
import psycopg2
from rpy2 import robjects
import rpy2.robjects.lib.ggplot2 as ggplot2
from rpy2.robjects import pandas2ri
R = robjects.r
R.X11() # 会打开一个窗口
pandas2ri.activate()
# 读取数据
SQL = """ """
with psycopg2.connect(DSN_HDD) as conn:
data = pd.read_sql(SQL, conn, params={'autocommit':True})
# 画图
gp = ggplot2.ggplot(data)
p = gp + ggplot2.aes_string(x='my_x', y='my_y') + ggplot2.geom_bar(stat='identity')
p.plot() # 图就会出现在窗口里
如何在IPython Notebook中用R
这个网页上面有很详细的资料。不过有一点需要更新的就是import。
在上面这个资料里,用的%load_ext rmagic
, 现在要用%load_ext rpy2.ipython
我一般最常用的如下。%%R
表示这整个block都是可以用R code。 -i
代表input,把python这边的数据传进R session,然后-u
是用来定义画图display的size的单位。我一般用cm
。-h
后面跟的是高度-w
后面跟的是宽度。
%%R -i my_python_data -u cm -h 15 -w 30
library(ggplot2)
ggplot(my_python_data, aes(x=my_x, y=my_y, fill=my_category)) +
geom_bar(stat='identity', position='stack') +
geom_text(aes(label=label_string, y=label_y_position), size=5) +
theme_gray(base_size = 20)
网友评论