Plotnine:Python图形语法

2021-01-29 05:03:52

使用Plotnine和Pandas将可视化章节从“ R for Data Science”翻译为Python。

plotnine是Hassan Kibirige创建的基于图形语法的Python数据可视化程序包。它的API与ggplot2类似,后者是Hadley Wickham等人开发的非常成功的R软件包。 1个

我是ggplot2的坚定支持者。图形的基本语法随附有一个一致的API,该API使您可以快速,迭代地创建不同类型的漂亮数据可视化,而几乎不必查阅文档。探索性数据分析时的一组受欢迎的属性。

我必须承认,我并没有尝试过所有适用于Python的数据可视化软件包,但是当涉及到最受欢迎的软件包时,我个人发现它们既方便又有限(熊猫),灵活却复杂(matplotlib),或者既美观又不一致( Seaborn)。你的旅费可能会改变。另一方面,plotine展示了很多前景,我估计它目前对ggplot2的功能覆盖率达到95%,并且仍在积极开发中。总而言之,作为同时使用R和Python的人,我非常很高兴能够将我的ggplot2知识转移到Python生态系统。

我认为plotnine可以使用一个很好的教程,以便也许更多的Pythonistas可以试一试这个包,而不是从头开始编写一个包,我转向了Hadley Wickham编写的ggplot2最佳免费教程和Garrett Grolemund,由O'Reilly Media在2016年出版。

我要做的就是将R和ggplot2的可视化章节(第3章和第28章)翻译成Python和plotnine,我要感谢Hadley,Garrett和O'Reilly Media给予我这样做的许可。现有的文本比编写新的文本要快,并且具有可以将plotnine的语法和覆盖范围与ggplot2进行比较的优点。

但是,虽然翻译速度更快,但翻译并不总是那么简单。我尝试了对原始文本进行尽可能少的更改,同时确保文本和代码仍保持同步。以防由于翻译而引入任何错误或错误之处,那么我就应该负责。例如,据我所知,没有任何作者对洛丁胺提出过任何主张。如果您发现这样的错误并认为它是可修复的,那么如果您d通过在Github上创建问题来通知我。谢谢。本教程中的章节编号链接回原始文本的相应章节,以备您进行比较。 3仅此序言和文本中散布的少量脚注完全是我的。

本教程也可以作为Jupyter笔记本和R笔记本使用,如果您要继续学习的话,如果克隆Github存储库,则可以在输出目录中找到这些笔记本.README包含有关如何运行笔记本的说明。 Jupyter笔记本电脑也可在Binder上使用,但请记住,交互式版本可能需要一段时间才能启动。

“简单的图表比其他任何设备都为数据分析师带来了更多信息。” —约翰·图基

本教程将教您如何使用Platenine可视化数据。 Python有许多用于制作图形的程序包,但plotnine是最优雅,功能最多的程序之一。 plotnine实现图形语法,这是用于描述和构建图形的连贯系统。使用platenine,您可以通过学习一个系统并将其应用到许多地方来更快地完成工作。

如果您想在开始之前进一步了解蛋氨酸的理论基础,建议阅读“图形的分层语法”。

本教程着重于蛋氨酸。我们还将使用一些numpy和pandas进行数据处理。要访问我们将在本教程中使用的数据集,帮助页面和功能,请通过运行以下代码导入4个必需的程序包:

如果您运行此代码并收到错误消息ModuleNotFoundError:没有名为' plotnine'的模块,则需要先安装它5,然后再次运行该代码。

您只需要安装一个软件包,但是每次运行脚本或(重新)启动内核时,都需要将其导入。

让我们使用第一个图表来回答一个问题:大型发动机的汽车比小型发动机的汽车消耗更多的燃料吗?您可能已经有了答案,但是请尝试使答案更精确。发动机尺寸和燃油效率之间的关系是什么样的?是积极的吗?负?线性的?非线性的?

您可以使用在plotnine.data中找到的mpg DataFrame测试答案。 DataFrame是变量(在列中)和观察值(在行中)的矩形集合。英里/加仑(mpg)包含美国环境保护署收集的有关38辆汽车的观察结果。

制造商型号显示年缸转换卡车公路等级0奥迪A4 1.8 1999 4自动(L5)F 18 29 P紧凑型1奥迪A4 1.8 1999 4手动(M5)F 21 29 P紧凑型2奥迪A4 2.0 2008 4手动(M6)F 20 31 p compact3 audi a4 2.0 2008 4 auto(av)f 21 30 p compact4 audi a4 2.8 1999 6 auto(l5)f 16 26 p compact .. ... ... ... ... .. ... ... ... ..... 229大众帕萨特2.0 2008 4 auto(s6)f 19 28 p中型230大众帕萨特2.0 2008 4手动(m6)f 21 29 p中型231大众帕萨特2.8 1999 6 auto( l5)f 16 26 p中型232大众帕萨特2.8 1999 6手动(m5)f 18 26 p中型233大众帕萨特3.6 2008 6 auto(s6)f 17 26 p中型[234行x 11列]

高速公路上的汽车燃油效率,以英里/加仑(mpg)为单位。当相同距离行驶时,低燃油效率的汽车比高燃油效率的汽车消耗更多的燃油。

要绘制mpg,请运行以下代码6,将displ放在x轴上,将hwy放在y轴上:

该图显示了发动机尺寸(偏移)和燃油效率(高速)之间的负相关关系。换句话说,大引擎的汽车消耗更多的燃料。这是否证实或驳斥了您关于燃油效率和发动机尺寸的假设?

使用plotine,您可以使用ggplot()函数开始绘图。 ggplot()创建一个可以添加图层的坐标系。 ggplot()的第一个参数是要在图形中使用的数据集。因此ggplot(data = mpg)创建了一个空图,但这并不是很有趣,因此我将不在此处显示。

通过向ggplot()添加一层或多层来完成图形。函数geom_point()在绘图中添加了一层点,从而创建了一个散点图。 plotnine带有许多geom函数,每个函数都会向绘图添加不同类型的图层。在本教程中,您将学到很多。

plotnine中的每个geom函数都带有一个映射参数。这定义了数据集中的变量如何映射到视觉属性。映射参数始终与aes()配对,而aes()的x和y参数指定要映射到x和y轴的变量。 plotnine在data参数(本例中为mpg)中查找映射的变量。

让我们将这段代码转换为可重复使用的模板,以使用plotine制作图表。要制作图表,请将下面代码中的方括号部分替换为数据集,geom函数或一组映射。

本教程的其余部分将向您展示如何完成和扩展此模板以制作不同类型的图形。我们将从< MAPPINGS>开始零件。

如果您绘制类vs drv散点图会怎样?为什么情节没有用?

“图片的最大价值在于,它迫使我们注意到人们曾经期望看到的东西。” —约翰·图基

在下面的图中,一组点(以红色突出显示)似乎不在线性趋势之内。这些汽车的行驶里程比您预期的要高。你怎么解释这些车?

让我们假设这些汽车是混合动力车。检验该假设的一种方法是查看每辆汽车的等级价值。 mpg数据集的class变量将汽车分类为紧凑型,中型和SUV等组。如果离群点是混合动力车,则应将其分类为紧凑型车或微型车(请注意,此数据是在混合动力卡车和SUV流行之前收集的)。

您可以通过将其映射到美学来向二维散点图添加第三个变量(例如class)。美观是情节中对象的视觉属性。美学包括点的大小,形状或颜色之类的东西。您可以通过更改其美学属性的值,以不同的方式显示一个点(如下所示)。由于我们已经使用“价值”一词来描述数据,所以我们使用“水平”一词来描述美学特性。在这里,我们更改点的大小,形状和颜色的级别,以使该点变小,呈三角形或呈蓝色:

您可以通过将绘图中的美观映射到数据集中的变量来传达有关数据的信息。例如,您可以将点的颜色映射到class变量以显示每个汽车的类。

要将美观性映射到变量,请在aes()中将美观性名称与变量名称相关联。橡皮糖会自动为变量的每个唯一值分配唯一的美学级别(此处为唯一的颜色),此过程称为缩放。勒皮宁还将添加一个图例,以说明哪些级别对应于哪些值。

颜色表明,许多不寻常的地方是两座汽车。这些汽车似乎不是混合动力车,实际上是跑车!跑车具有大型发动机(例如SUV和皮卡车),而小型车身(例如中型和紧凑型汽车)则提高了汽油行驶里程。事后看来,这些汽车不太可能是混合动力车,因为它们具有大型发动机。

在上面的示例中,我们将类映射到颜色美学,但是我们可以以相同的方式将类映射到尺寸美学。在这种情况下,每个点的确切大小将显示其类隶属关系。我们在这里得到警告,因为将无序变量(类)映射到有序美学(大小)不是一个好主意。

同样,我们可以将制造商映射到控制点透明性的alpha美感,或控制点的形状的形状美感。 7

丰田和大众怎么了?橡皮糖一次只能使用13种形状。默认情况下,使用形状美学时,其他组将不作图。

对于每种美学,都可以使用aes()将美学名称与要显示的变量相关联。 aes()函数将图层使用的每个美学映射收集在一起,并将其传递给图层的映射参数。该语法突出显示了有关x和y的有用见解:点的x和y本身就是美观,可以将可视属性映射到变量以显示有关数据的信息。

一旦绘制了美学图,皮兰汀就会处理剩下的一切。它选择了一个合理的比例以配合美学,并构造了一个图例来解释级别和值之间的映射。对于x和y美学,plotine不会创建图例,而是创建带有刻度线和标签的轴线。轴线充当图例;它说明了位置和值之间的映射。

您还可以手动设置几何图形的美学属性。例如,我们可以将图中的所有点设为蓝色:

在这里,颜色不会传达有关变量的信息,而只会改变图形的外观。要手动设置美学,请按名称将美学设置为geom函数的参数;即它不在aes()之外。您需要选择一种适合该美学的水平:

mpg中的哪些变量是分类的?哪些变量是连续的?(提示:键入?mpg以阅读数据集的文档)。运行mpg时如何查看此信息?

将连续变量映射到颜色,大小和形状。这些美学对于分类变量和连续变量的表现如何不同?

如果将美学映射到变量名以外的其他内容(例如aes(colour =" displ< 5")),会发生什么?请注意,您还需要指定x和y。

在开始运行Python代码时,您可能会遇到问题。不用担心-每个人都会发生。我已经写了多年的Python代码,而且每天我仍然写不起作用的代码!

首先,将您正在运行的代码与本书中的代码进行仔细比较。 Python非常挑剔,并且放错位置的字符可能会有所不同。确保每个(与匹配)和每个"与另一个"配对。

创建绘图图形时的一个常见问题是忘记\:它必须出现在行尾。换句话说,请确保您没有意外编写如下代码:

另外,如果将整个表达式用括号括起来,则可以省略\:

如果仍然遇到问题,请尝试帮助。您可以通过运行?function_name获得有关任何Python函数的帮助。如果帮助看起来没有帮助,请不要担心-跳到示例并查找与您尝试执行的操作匹配的代码。

如果这样做没有帮助,请仔细阅读错误消息。有时答案会埋在这里!但是,当您不熟悉Python时,答案可能是在错误消息中,但您还不知道如何理解它。另一个很棒的工具是Google:尝试搜索错误消息,因为其他人可能也遇到了同样的问题,并且已经获得在线帮助。

添加其他变量的一种方法是美观。另一种对分类变量特别有用的方法是将绘图分成多个面,子面,每个面显示数据的一个子集。

要通过单个变量对图进行构图,请使用facet_wrap()。 facet_wrap()的第一个参数应该是一个公式,该公式由〜创建,后跟一个变量名(此处“ formula”是Python中数据结构的名称,而不是“ equation”的同义词)。您传递给facet_wrap()的变量应该是离散的。

要在两个变量的组合上进行绘图,请将facet_grid()添加到绘图调用中。 facet_grid()的第一个参数也是一个公式。这次,公式应包含两个用〜分隔的变量名。

如果您不想在“行”或“列”维度中不使用任何方面,请使用。而不是变量名,例如+ facet_grid(&#34 ;.〜cyl")。

使用facet_grid(" drv〜cyl")的情节中的空单元格是什么意思?它们与该情节有何关系?

使用分面代替颜色美学有什么好处?有什么缺点?如果您拥有更大的数据集,余额将如何变化?

阅读?facet_wrap。乌鸦做什么? ncol是做什么的?还有哪些其他选项控制各个面板的布局?为什么facet_grid()没有nrow和ncol参数?

使用facet_grid()时,通常应将具有更独特级别的变量放在列中。为什么?

两个图都包含相同的x变量,相同的y变量,并且都描述相同的数据。但是情节并不相同。每个图都使用不同的视觉对象表示数据。用记号语法,我们说它们使用不同的几何。

几何是绘图用来表示数据的几何对象。人们通常根据地块使用的几何类型来描述地块。例如,条形图使用条形图,折线图使用线形图,箱线图使用盒线图几何图,依此类推。散点图打破了趋势;他们使用点几何。如上所示,您可以使用不同的几何图形来绘制相同的数据。左边的图使用点几何,右边的图使用平滑几何,一条平滑的线适合数据。

要更改绘图中的几何图形,请更改添加到ggplot()的geom函数。例如,要制作上述图形,可以使用以下代码:

plotnine中的每个geom函数都有一个映射参数。但是,并非每一种美学都适用于每一种几何。您可以设置点的形状,但不能设置线的“形状”。另一方面,您可以设置线的线型。 geom_smooth()将为映射到线型的变量的每个唯一值绘制一条不同的线,并使用不同的线型。

这里的geom_smooth()根据汽车的drv值将汽车分为三行,该值描述了汽车的传动系统。一行描述了所有值为4的点,一行描述了所有值为f的点,一行描述了所有值为r的点。在此,4代表四轮驱动,f代表前轮驱动,r代表后轮驱动。

如果听起来很奇怪,我们可以通过在原始数据上叠加线条,然后根据drv为所有内容着色来使其更加清晰。

注意,该图在同一图中包含两个几何!如果这使您兴奋,请系好安全带。我们将很快学习如何在同一图中放置多个几何图形。

橡皮糖提供30多个几何图形。获得全面概述的最佳方法是ggplot2备忘单,您可以在http://rstudio.com/cheatsheets中找到该备忘单。要了解有关任何单个几何的更多信息,请使用帮助:?geom_smooth。

许多几何图形(例如geom_smooth())都使用单个几何对象显示多行数据。对于这些几何,可以将组的美观度设置为分类变量以绘制多个对象。 plotnine将为分组变量的每个唯一值绘制一个单独的对象。实际上,每当您将美学映射到离散变量时(如线型示例),plotine都会自动将这些几何的数据分组。依靠此功能很方便,因为组美学本身不会为图例添加图例或区别特征。

但是,这在我们的代码中引入了一些重复。想象一下,如果您想更改y轴以显示cty而不是hwy。您需要在两个位置更改变量,而您可能会忘记更新一个。您可以通过将一组映射传递给ggplot()来避免这种重复。 plotnine会将这些映射视为适用于图形中每个几何的全局映射。换句话说,此代码将产生与先前代码相同的图:

如果将映射放置在geom函数中,则plotnine将其视为该图层的本地映射。它将仅使用这些映射来扩展或覆盖该层的全局映射。这使得可以在不同的层中显示不同的美学。

您可以使用相同的想法为每个图层指定不同的数据。在这里,我们的平滑线仅显示mpg数据集的一个子集,即小型汽车。 geom_smooth()中的局部数据参数仅覆盖该层的ggplot()中的全局数据参数。

您将使用哪种几何图形绘制折线图?箱线图?直方图?面积图?

在脑海中运行此代码并预测输出结果,然后在Python中运行该代码并检查您的预测。

show_legend = False有什么作用?如果删除它会怎样?为什么您认为我在本章前面使用过它?

您可以通过检查stat参数的默认值来了解geom使用哪个stat。例如,?geom_bar显示stat的默认值为“ count”,这意味着geom_bar()使用stat_count()。 stat_count()与geom_bar()记录在同一页面上,如果向下滚动,则可以找到一个名为“计算变量”的部分。这说明了它如何计算两个新变量:count和prop。

通常,您可以互换使用geoms和stats。例如,您可以使用stat_count()而不是geom_bar()重新创建上一个图:

之所以可行,是因为每个geom都有默认统计信息。每个统计信息都有一个默认的几何图形。这意味着您通常可以使用几何,而不必担心基础统计转换。您可能需要使用三个原因

......