如何在Python里用ggplot2绘图
2019年06月09日 由 sunlei 发表
989795
0
为了严格实现图形语法,ggplot2提供了一种非常直观和一致的方式来绘制数据。ggplot2的绘图方法不仅确保每个绘图包含特定的基本元素,而且在很大程度上简化了代码的可读性。
但是,如果您经常使用Python,那么实现图形语法将非常具有挑战性,因为在流行的绘图库(如matplotlib或seaborn)中缺少标准化语法。如果您仍然希望使用图形语法,那么Python包plotnine为您提供了另一种选择。
图形语法
如果你不熟悉图形语法,下面简单介绍一下:
[caption id="attachment_41072" align="aligncenter" width="880"]
图形语法的主要组成部分[/caption]
可以看到,从数据开始,有几个组件组成了图形语法。在确定要可视化的数据之后,必须指定感兴趣的变量。例如,您可能希望在x轴上显示一个变量,在y轴上显示另一个变量。第三,您必须定义要使用哪种类型的几何对象(简称geom)。这可以是从条形图到散点图或任何其他现有绘图类型的任何内容。
前三个部分是强制性的。没有数据,就没有什么可以绘制的。如果没有轴的定义,也没有什么可以绘制的。最后,不定义几何对象,你只会看到一个空坐标系。构成图形语法的其余组件是可选的,可以实现它们来改进可视化。facet指的是子图的规范,也就是说,在单独的图中,将数据中的多个变量相邻地绘制在一起。统计转换主要指在图表中包含汇总统计信息,例如中位数或百分位数。坐标描述了不同的坐标系。最常用和默认的坐标系是笛卡尔坐标系。根据您想要绘制的数据的结构,使用较少的坐标系(如极坐标系统)可能提供一种更好的可视化数据的方法。最后,主题提供了各种选项来设计绘图的所有非数据元素,如图例、背景或注释。
虽然有很多可视化图形语法的方法,但我特别喜欢上面创建的语法,因为它意味着这些层的可加性,以及它们之间正在相互构建的事实。如果您曾经使用过ggplot2,那么您应该熟悉语法中的“+”,它表示上面描述的相同的思想。
plotnine
plotnine是一个Python包,允许您使用类似ggplot2的代码来实现图形语法。通过这样做,就像在ggplot2中一样,您可以将数据映射到构成可视化的可视对象。这使您能够提高代码的可读性和结构。虽然可以将matplotlib的样式设置为ggplot,但是不能像在ggplot2中那样在matplotlib中实现图形语法。
安装
在开始之前,您必须安装plotnine。像往常一样,有两种主要的选择:pip和conda。
# Using pip
pip install plotnine
# Using conda
conda install -c conda-forge plotnine
作图
安装了plotnine之后,就可以开始使用图形语法进行绘图了。让我们从构建一个非常简单的绘图开始,只使用三个必需的组件:数据、美学和几何对象。
如您所见,语法与ggplot2非常相似。首先,我们指定数据源。在我们的例子中,我们使用的数据是经典的MPG数据集。接下来,我们定义变量“class”将显示在x轴上。最后,我们说我们要使用一个条形图,其中的条形图大小为20,以可视化我们的数据。让我们看看完整的代码和结果图:
import pandas as pd
import numpy as np
from pandas.api.types import CategoricalDtype
from plotnine import *
from plotnine.data import mpg
%matplotlib inline
(ggplot(mpg) # defining what data to use
+ aes(x='class') # defining what variable to use
+ geom_bar(size=20) # defining the type of plot to use
)
上述代码将产生以下输出:
虽然这是一个良好的开端,但目前来看它还不是很好。让我们用图形语法的其他组成部分来美化我们的情节。
(ggplot(mpg)
+ aes(x='class')
+ geom_bar(size=20)
+ coord_flip() # flipping the x- and y-axes
+ labs(title='Number of Vehicles per Class', x='Vehicle Class', y='Number of Vehicles') # customizing labels
)
例如,我们可以使用coord_flip()翻转坐标轴,并使用labs()自定义绘图和轴标题,以改进绘图。使用上面的代码块,我们的绘图如下所示:
绘制多维数据
除了基本的绘图之外,您几乎可以在ggplot2中做任何其他可以做的事情,比如绘制多维数据。如果你想可视化三个变量之间的关系,您可以将美学添加到另一个二维图中:
(ggplot(mpg)
+ aes(x='displ', y='hwy', color='class')
+ geom_point()
+ labs(title='Engine Displacement vs. Highway Miles per Gallon', x='Engine Displacement, in Litres', y='Highway Miles per Gallon')
)
将颜色添加到美学中会提示plotnine在其y轴上使用disp(发动机排量,单位为升)在其x和hwy(高速公路英里/加仑)上显示二维绘图,并根据变量类对数据进行着色。我们还将几何对象切换到geom_point(),这将为我们提供一个散点图,而不是条形图。让我们来看看会是什么样子:
结论
如您所见,plotnine为您提供了利用Python中图形语法的能力。这提高了代码的可读性,并允许您将部分数据具体映射到可视对象。如果你已经熟悉ggplot2,那么你就不需要学习任何新的东西来掌握plotnine。但是如果你没有,就要行动起来,赶快去学吧~