plotnine: Python版的ggplot2作图库

Karen110
• 阅读 1899

R语言的ggplot2绘图能力超强,python虽有matplotlib,但是语法臃肿,使用复杂,入门极难,seaborn的出现稍微改善了matplotlib代码量问题,但是定制化程度依然需要借助matplotlib,使用难度依然很大。

而且咱们经管专业学编程语言,一直有一个经久不衰的问题-“学数据分析,到底选择R还是Python”。通过plotnine这个库,你就可以在python世界中体验下R语言的新奇感,体验可视化之美,如果着迷上瘾,再学R也不迟。

plotnine包,可以实现绝大多数ggplot2的绘图功能,两者语法十分相似,R和Python的语法转换成本大大降低。

安装

pip install plotnine  

准备数据

from plotnine.data import mpg  

#dataframe  
mpg.head()  

| | manufacturer | model | displ | year | cyl | trans | drv | cty | hwy | fl | class | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 0 | audi | a4 | 1.8 | 1999 | 4 | auto(l5) | f | 18 | 29 | p | compact | | 1 | audi | a4 | 1.8 | 1999 | 4 | manual(m5) | f | 21 | 29 | p | compact | | 2 | audi | a4 | 2.0 | 2008 | 4 | manual(m6) | f | 20 | 31 | p | compact | | 3 | audi | a4 | 2.0 | 2008 | 4 | auto(av) | f | 21 | 30 | p | compact | | 4 | audi | a4 | 2.8 | 1999 | 6 | auto(l5) | f | 16 | 26 | p | compact |

快速作图qplot

我们先直接看最简单好用的快速作图函数qplot(x, y, data)

  • 横坐标displ

  • 纵坐标cty

  • 数据mpg

from plotnine import qplot  

qplot(x='displ',   
      y='cty',  
      data=mpg)  

plotnine: Python版的ggplot2作图库

`<ggplot: (322851325)>  
`

ggplot图层

qplot是快速作图函数,如果想让图更好看,进行私人订制,那么我们需要进行图层设计

首先设置ggplot图层(相当于买了一个高级画布),

  • 数据mpg

  • 横坐标x轴为displ

  • 纵坐标y轴cty

在plotnine中,变量所对应的数据均可通过字段名调用

from plotnine import ggplot, geom_point, aes  

ggplot(aes(x='displ', y='cty'), mpg)  

plotnine: Python版的ggplot2作图库

`<ggplot: (321957793)>  
`

图层叠加

我们可以看到,已经绘制出一个空的ggplot图层,x轴为displ,y轴为cty。

接下来我们给这个图层上加上数据对应的散点,使用geom_point()直接追加在ggplot图层之上即可。

(  
    ggplot(aes(x='displ', y='cty'), mpg)  
    + geom_point()  
)  

plotnine: Python版的ggplot2作图库

`<ggplot: (322466061)>  
`

color

在上图中,散点是没有区分每辆车的气缸数cyl。

在geom_point()中,我们可以按照气缸数cyl分门别类,按照颜色显示出来

(  
    ggplot(aes(x='displ', y='cty'), mpg)  
    + geom_point(aes(color='cyl'))  
)  

plotnine: Python版的ggplot2作图库

`<ggplot: (323647173)>  
`

上图挺好看的,有时候需要绘制的字段是离散型数值,但是上色后可能不够明显,需要声明该字段为离散型。这时候用factor()来告诉plotnine,这个字段是离散型数值

(  
    ggplot(aes(x='displ', y='cty'), mpg)  
    + geom_point(aes(color='factor(cyl)'))   
)  

plotnine: Python版的ggplot2作图库

`<ggplot: (321918425)>`

size

有时候为了增加可视化显示的维度数,还可以考虑加入点的大小size

(  
    ggplot(aes(x='displ', y='cty'), mpg)  
    + geom_point(aes(size='hwy'))  
)  

plotnine: Python版的ggplot2作图库

<ggplot: (323399013)>

梯度色

如果你想自己设置颜色的梯度,可以通过scale_color_gradient设置

from plotnine import scale_color_gradient  

(  
    ggplot(aes(x='displ', y='cty'), mpg)  
    + geom_point(aes(color='hwy'))  
    + scale_color_gradient(low='blue', high='red')  
)  

plotnine: Python版的ggplot2作图库

<ggplot: (323622897)>  

条形图

plotnine中可绘制的图有很多,刚刚已经讲了散点图,接下来我们看看plotnine中的条形图。

首先准备一下数据

import pandas as pd  

df = pd.DataFrame({  
    'variable': ['gender', 'gender', 'age', 'age', 'age', 'income', 'income', 'income', 'income'],  
    'category': ['Female', 'Male', '1-24', '25-54', '55+', 'Lo', 'Lo-Med', 'Med', 'High'],  
    'value': [60, 40, 50, 30, 20, 10, 25, 25, 40],  
})  
df['variable'] = pd.Categorical(df['variable'], categories=['gender', 'age', 'income'])  
df['category'] = pd.Categorical(df['category'], categories=df['category'])  

df  

| | variable | category | value | | --- | --- | --- | --- | | 0 | gender | Female | 60 | | 1 | gender | Male | 40 | | 2 | age | 1-24 | 50 | | 3 | age | 25-54 | 30 | | 4 | age | 55+ | 20 | | 5 | income | Lo | 10 | | 6 | income | Lo-Med | 25 | | 7 | income | Med | 25 | | 8 | income | High | 40 |

from plotnine import ggplot, aes, geom_text, position_dodge, geom_point  

#调整文本位置  
dodge_text = position_dodge(width=0.9)                              # new  

(  
    ggplot(df, aes(x='variable',   
                   y='value',   
                   fill='category')) #类别填充颜色  
    + geom_col(position='dodge',   
               show_legend=False)   # modified  
    + geom_text(aes(y=-.5, label='category'),                          # new  
                position=dodge_text,  
                color='gray',  #文本颜色  
                size=8,   #字号  
                angle=30, #文本的角度  
                va='top')  

 + lims(y=(-5, 60))                                                 # new  
)  

plotnine: Python版的ggplot2作图库

<ggplot: (334727813)>  
from plotnine.data import economics_long  

economics_long.head()  

| | date | variable | value | value01 | | --- | --- | --- | --- | --- | | 0 | 1967-07-01 | pce | 507.4 | 0.000000 | | 1 | 1967-08-01 | pce | 510.5 | 0.000266 | | 2 | 1967-09-01 | pce | 516.3 | 0.000764 | | 3 | 1967-10-01 | pce | 512.9 | 0.000472 | | 4 | 1967-11-01 | pce | 518.1 | 0.000918 |

from plotnine import ggplot, aes, geom_line  

(  
    ggplot(economics_long, aes(x='date', y='value01', color='variable'))  
    + geom_line()  
)  

plotnine: Python版的ggplot2作图库

<ggplot: (334895445)>  

plotnine目前已经支持绝大多数ggplot2,但是文档方面没有ggplot2全,所以学习plotnine时可以参考ggplot2。

**公众号后台回复关键词【plotnine入门】即可下载本文数据代码!**

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

plotnine: Python版的ggplot2作图库

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/4wA4Jv_wog0fbKqeupoBEw,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这