在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 执行字符串表达式函数(eval exec execfile)
Aug 11 Python
Python实现简单多线程任务队列
Feb 27 Python
python实现SOM算法
Feb 23 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
Python chardet库识别编码原理解析
Feb 18 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
Mysql数据库反向生成Django里面的models指令方式
May 18 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
Jun 23 Python
解决python便携版无法直接运行py文件的问题
Sep 01 Python
python进行二次方程式计算的实例讲解
Dec 06 Python
如何在Python中创建二叉树
Mar 30 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
ASP和PHP都是可以删除自身的
2007/04/09 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
php上传文件常见问题总结
2015/02/03 PHP
php创建无限级树型菜单
2015/11/05 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
jQuery的学习步骤
2011/02/23 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
Python入门篇之函数
2014/10/20 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
python计算一个序列的平均值的方法
2015/07/11 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python Tkinter实现简易计算器功能
2018/01/30 Python
新年快乐! python实现绚烂的烟花绽放效果
2019/01/30 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
英语系本科生求职信范文
2013/12/18 职场文书
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
大学运动会通讯稿
2014/01/28 职场文书
支部组织生活会方案
2014/06/10 职场文书
企业精神口号
2014/06/11 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
网络研修随笔感言
2015/11/18 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书
利用uni-app生成微信小程序的踩坑记录
2022/04/05 Javascript