在Python中调用ggplot的三种方法


Posted in Python onApril 08, 2015

本文提供了三种不同的方式在Python(IPython Notebook)中调用ggplot。

在大数据时代,数据可视化是一个非常热门的话题。各个BI的厂商无不在数据可视化领域里投入大量的精力。Tableau凭借其强大的数据可视化的功能成为硅谷炙手可热的上市公司。Tableau的数据可视化的产品,其理论基础其实是《The Grammar of Graphic》,该书提出了对信息可视化的图表的语法抽象体系,数据的探索和分析可以由图像的语法来驱动,而非有固定的图表类型来驱动,使得数据的探索过程变得友好而有趣。

然而对于The Grammar of Graphic的理论的实践,并非Tableau独占,ggplot作为R语言上得一个图形库,其理论基础也是这本书。(注,笔者曾就职的某BI巨头,主要职责也是数据可视化,我们曾经和加拿大团队研发过类似的产品,基于HTML5和D3,可惜由于种种原因未能推向市场)

现在越来越多的人开始使用python来做数据分析,IPython Notebook尤其令人喜爱,它的实时交互把脚本语言的优势发挥到极致。那么怎样才能在IPython Notebook中使用ggplot呢?我这里跟大家分享三种不同的方式供大家选择。
RPy2

第一种方式是使用rpy2, rpy2是对rpy的改写和重新设计,旨在提供Python用户在python中使用R的API。

rpy2提供了对R语言的对象和方法的基本封装,当然也包括可视化的图库这一块。

下面就是一段运行ggplot的R程序使用rpy2在python中运行的例子:
 

from rpy2 import robjects
from rpy2.robjects import Formula, Environment
from rpy2.robjects.vectors import IntVector, FloatVector
from rpy2.robjects.lib import grid
from rpy2.robjects.packages import importr, data
import rpy2.robjects.lib.ggplot2 as ggplot2
 
# The R 'print' function
rprint = robjects.globalenv.get("print")
stats = importr('stats')
grdevices = importr('grDevices')
base = importr('base')
datasets = importr('datasets')
 
mtcars = data(datasets).fetch('mtcars')['mtcars']
 
pp = ggplot2.ggplot(mtcars) + \
   ggplot2.aes_string(x='wt', y='mpg', col='factor(cyl)') + \
   ggplot2.geom_point() + \
   ggplot2.geom_smooth(ggplot2.aes_string(group = 'cyl'),
             method = 'lm')
pp.plot()

以上程序在IPython Notebook中运行会有缺陷,会弹出一个新的窗口显示图,而且该python进程会阻塞在那里。我们希望图表能内嵌在IPython Notebook的页面中,为了解决该问题,我们引入如下代码:
 

%matplotlib inline
 
import uuid
from rpy2.robjects.packages import importr 
from IPython.core.display import Image
 
grdevices = importr('grDevices')
def ggplot_notebook(gg, width = 800, height = 600):
  fn = '{uuid}.png'.format(uuid = uuid.uuid4())
  grdevices.png(fn, width = width, height = height)
  gg.plot()
  grdevices.dev_off()
  return Image(filename=fn)

运行上述代码后,我们把ggplot的调用pp.plot()改为调用ggplot_notebook(pp, height=300)就能成功嵌入显示ggplot的结果。

在Python中调用ggplot的三种方法

RMagic

另一种方式是使用rmagic,rmagicy实际上依赖于rpy2。它的使用方式更像是直接在使用R
 

%load_ext rmagic
library(ggplot2)
dat <- data.frame(x = rnorm(10), y = rnorm(10), 
         lab = sample(c('A', 'B'), 10, replace = TRUE))
x <- ggplot(dat, aes(x = x, y = y, color = lab)) + geom_point()
print(x)

运行结果如下

在Python中调用ggplot的三种方法

ggplot for python

ggplot是一个python的库,基本上是对R语言ggplot的功能移植到Python上。

运行安装脚本

pip install ggplot

安装成功后,可以试一下这个例子
 

%matplotlib inline
import pandas as pd
from ggplot import *
meat_lng = pd.melt(meat[['date', 'beef', 'pork', 'broilers']], id_vars='date')
ggplot(aes(x='date', y='value', colour='variable'), data=meat_lng) + \
  geom_point() + \
  stat_smooth(color='red')

结果如下:

在Python中调用ggplot的三种方法

总结

本文提供了三种不同的方式在Python(IPython Notebook)中调用ggplot。

rpy2和Rmagic都是一种对R的桥接,所以都需要安装R。不同之处在于rpy2提供Python接口而Rmagic更接近R。

ggplot Python库是ggplot的Python移植,所以无需安装R,部署起来更为简单,但功能上也许和R的ggplot还有差距。

大家可以根据自己的需要做出选择。

Python 相关文章推荐
Python实现二分法算法实例
Feb 02 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
Python实现冒泡排序的简单应用示例
Dec 11 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
解决新django中的path不能使用正则表达式的问题
Dec 18 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
Python进阶:生成器 懒人版本的迭代器详解
Jun 29 Python
纯python进行矩阵的相乘运算的方法示例
Jul 17 Python
python实现大量图片重命名
Mar 23 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
如何清空python的变量
Jul 05 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 Python
Python字符串和文件操作常用函数分析
Apr 08 #Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 #Python
python smtplib模块发送SSL/TLS安全邮件实例
Apr 08 #Python
python复制与引用用法分析
Apr 08 #Python
Python导入txt数据到mysql的方法
Apr 08 #Python
python集合类型用法分析
Apr 08 #Python
在Python中使用Mako模版库的简单教程
Apr 08 #Python
You might like
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
js获取RadioButtonList的Value/Text及选中值等信息实现代码
2013/03/05 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
jQuery插件扩展测试实例
2016/06/21 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
Python迭代和迭代器详解
2016/11/10 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
python让列表倒序输出的实例
2018/06/25 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
解决python线程卡死的问题
2019/02/18 Python
Python3分析处理声音数据的例子
2019/08/27 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
公司应聘求职信
2014/06/21 职场文书
校庆团日活动总结
2014/08/28 职场文书
承诺书样本
2014/08/30 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
工商行政处罚决定书
2015/06/24 职场文书
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript