在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使用os模块的os.walk遍历文件夹示例
Jan 27 Python
pyqt4教程之messagebox使用示例分享
Mar 07 Python
Python中的并发编程实例
Jul 07 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
python+opencv识别图片中的圆形
Mar 25 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 Python
python中count函数简单用法
Jan 05 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
python中翻译功能translate模块实现方法
Dec 17 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
做一个有下拉功能的留言版
2006/10/09 PHP
模仿OSO的论坛(一)
2006/10/09 PHP
php下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
2013/04/10 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
经济与贸易专业应届生求职信
2013/11/19 职场文书
百日安全生产活动总结
2014/07/05 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
企业授权委托书范本
2014/09/22 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
工作作风建设心得体会
2014/10/22 职场文书
2014年节能工作总结
2014/12/18 职场文书
南极大冒险观后感
2015/06/05 职场文书
小爸爸观后感
2015/06/15 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
vue 实现上传组件
2021/05/31 Vue.js