前面两课分别介绍了 Matplotlib 和 Seaborn,其基本的绘图思想是一样的:面向对象修改或添加对象的属性。本课要介绍的 Plotnine,看标题就明白,它必然有不同以往之处,也的确与 Matplotlib 体系有所不同。
Plotnine 在绘图上,引入了“图层”的概念——如果熟悉美工妹妹的工作,这个概念就不难理解。它不是师承于 Matplotlib,而是基于 ggplot2。
3.1.1 渊源和特点
能够用于数据科学的语言不只是 Python,还有很多其他语言,比如 R ——一个具有一定历史并且目前也被很多人使用的语言。
R 语言,主要用于统计分析、绘图、数据挖掘,由新西兰奥克兰大学的罗斯·伊哈卡和罗伯特·杰特曼发明。
那么,支持 R 语言绘图的工具之一就是 ggplot2(官网:https://ggplot2.tidyverse.org/),它由 Hadley Wickham 创建,其绘图基本思想是(以下是基本概念介绍,参考了 STHDA 的有关内容):
Plot(图)= Data(数据集)+ Aesthetics(美学映射)+ Geometry(几何对象)
这种制度的基本规则来自于 The Grammar of Graphics 一书中的规定,各项的含义如下:
- Data,数据集;
- Aesthetics,美学映射,比如将变量映射给 X、Y 坐标轴,或者映射给颜色、大小、形状等图形属性;
- Geometry,几何对象,比如柱形图、直方图、散点图、线图、密度图等。
在 ggplot2 中有两个主要绘图函数:
- qplot,快速绘图;
- ggplot,此函数是 ggplot2 的精髓,远比 qplot() 强大,可以绘制复杂的图形。
在 ggplot2 中有几个基本概念,需要了解一下。
- 图层(Layer):一个图层好比是一张“透明纸”,包含有各种图形元素,可以分别建立不同的图层,然后叠放在一起,组合成图形的最终效果。
- 标度(Scale):标度控制了数学空间到图形元素空间的映射。一组连续数据可以映射到 X 轴坐标,也可以映射到一组连续的渐变色彩;一组分类数据可以映射成为不同的形状,也可以映射成为不同的大小。
- 坐标系(Coordinate):坐标系控制了图形的坐标轴并影响所有图形元素,最常用的是直角坐标轴。坐标轴可以进行变换以满足不同的需要,如对数坐标,其他可选的还有极坐标。
- 位面、组图、分面(Facet):很多时候需要将数据按某种方法分组,分别进行绘图。facet 就是控制分组绘图的方法和排列形式。(注意,将 facet 翻译为“位面”,有时候会造成误解,因为 planes 也翻译为“位面”)。
这是 R 的 ggplot2 的概念,Python 要挑战 R 语言,那么它有的 Python 就要有了,这样,我们在 Python 中也能使某些绘图工具,实现上述的绘图思想。比较常用的有:
- ggplot,官网:http://ggplot.yhathq.com/
- Plotnine,官网:https://plotnine.readthedocs.io/en/stable/about-plotnine.html
Plotnine 因为继承了 R 语言的 ggplot2 的绘图思想,因此,图层概念就是它的核心。
Plotnine 的安装应该已经在第 0-3 课中完成了,如果尚未安装,请参考之。
3.1.2 理解图层含义
先用一个示例体会一下“分层绘图—图层”的思想和操作流程。
在 Plotnine 中,也有类似 Seaborn 那样集成的数据集。
%matplotlib inline
import plotnine as p9
from plotnine import data
mg = data.mpg
mg.head()
mg.info()
#out
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 234 entries, 0 to 233
Data columns (total 11 columns):
manufacturer 234 non-null category
model 234 non-null category
displ 234 non-null float64
year 234 non-null int64
cyl 234 non-null int64
trans 234 non-null category
drv 234 non-null category
cty 234 non-null int64
hwy 234 non-null int64
fl 234 non-null category
class 234 non-null category
dtypes: category(6), float64(1), int64(4)
memory usage: 13.9 KB
这个数据集中记录了一些跟汽车有关的数据,其中三个特征,是下面将要用到的:
- displ,发动机排气量;
- hwy,高速公路上每加仑汽油能够行驶的路程;
- cyl,汽缸数目。
因为 Plotnine 继承了 ggplot2,本质上可以理解为就是要跟 R 语言争夺绘图领域的老大地位。那么如果读者是 Plotnine 的发明者,会如何命名自己的函数,才能更有利于把原来使用 ggplot2 的用户争取过来呢?
当然是所有的函数和语法都要保持与 ggplot2 一样。
英雄所见略同,都想到一起了。凡是在 ggplot2 中能够使用的函数,在 Plotnine 中几乎都有,而且使用方式也一样。因此,如果以前学过了 ggplot2,迁移过来丝毫不费力;如果没学过,那么当然就需要阅读本课程了。当然,如果在网上搜索到了 ggplot2 的方法,也可以直接拿到 Plotnine 中使用。
这招的确很绝妙,这就是所谓的后发优势。
那就先制作第一张图。