如何在 Python 中使用 ggplot2?
作者 | Lukas Frei
编译 | 史提芬先森
原文 | How to Use ggplot2 in Python
简介
由于严格执行图形语法,ggplot2 提供了一种极其直观且一致的数据绘制方式。 ggplot2 的绘图方法不仅确保每个绘图都包含某些基本元素,而且在很大程度上简化了代码的可读性。
但是,如果您是 Python 的频繁使用用户,那么由于 matplotlib 或 seaborn 等流行绘图库中缺乏标准化语法,因此实现图形语法可能会非常具有挑战性。 如果您仍想使用图形语法,那么 Python 包 plotnine 为您提供了另一种选择。
图形语法
如果您不熟悉图形的语法,这里有一个快速概述:
如您所见,从您的数据开始,有几个组件构成了图形的语法。在确定要可视化的数据后,您必须指定您感兴趣的变量。例如,您可能希望在 x 轴上显示一个变量,在 y 轴上显示另一个变量。第三,你必须定义你想使用什么类型的几何对象(geometric object,简称 geom)。这可以是从条形图到散点图或任何其他现有绘图类型的任何东西。
所有的组件中,前三个组件是强制性的。没有数据,就没有什么可绘制的。没有轴定义,也没有什么可以绘制的。最后,如果不定义几何对象,您只会看到一个空坐标系。构成图形语法的其余组件是可选的,可以它们的实现以改进可视化。分面(facet) 指的是子图(subplots)的规范,也就是说,在单独的图中,将数据中的几个变量挨个绘制出来。统计转换主要是指在绘图中包含汇总统计信息,例如中位数或百分位数。坐标描述了可供您使用的不同坐标系。最常用和默认的坐标系是笛卡尔坐标系。根据您要绘制的数据结构,较少使用的坐标系(例如极坐标系)可能会提供更好的数据可视化方式。最后,主题提供了多种选项来设计绘图的所有非数据元素,例如图例、背景或注释。
虽然有许多可视化图形语法的方法,但我特别喜欢我在上面创建的那个,因为它暗示了这些层的可加性以及它们相互构建的事实。如果您曾经使用过 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 之后,就可以开始使用图形语法绘制图形了。让我们开始构建一个非常简单的绘图,只使用三个必不可少的组成部分:数据、aesthetics 组件和几何对象。
如您所见,语法非常类似于 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')
)
将 color 添加到 aesthetics 组件中将会促使 plotnine 呈现一个在 x 轴上使用 displ(发动机排量,以升为单位)和在 y 轴上使用 hwy(每加仑高速公路英里数),并根据 class 变量为数据着色的二维图。我们还可以将几何对象切换到 geom_point()
,这将为我们提供散点图而不是条形图。 让我们来看看会是什么样子:
总结
如您所见,plotnine 为您提供了在 Python 中利用图形语法的能力。这增加了代码的可读性,并允许您将部分数据专门映射到可视对象。如果您已经熟悉 ggplot2,那么您无需学习任何新知识即可掌握 plotnine。如果没有,这里是 ggplot2 网站的链接,您可以在该网站上找到更多关于图形语法和所有类型的可用几何对象的信息。
如何在 Python 中使用 ggplot2?相关推荐
- 如何在python中找到两个日期时间对象之间的时差?
本文翻译自:How do I find the time difference between two datetime objects in python? 如何分辨两个datetime对象之间的时 ...
- 如何在Python中声明一个数组?
如何在Python中声明数组? 我在文档中找不到任何对数组的引用. #1楼 这个怎么样... >>> a = range(12) >>> a [0, 1, 2, 3 ...
- 如何在Python中捕获SIGINT?
我正在研究启动多个进程和数据库连接的python脚本. 我不时地想用Ctrl + C信号杀死脚本,我想进行一些清理. 在Perl中,我可以这样做: $SIG{'INT'} = 'exit_gracef ...
- 如何在Python中解析YAML文件
如何在Python中解析YAML文件? #1楼 不依赖C标头的最简单,最纯净的方法是PyYaml( 文档 ): #!/usr/bin/env pythonimport yamlwith open(&q ...
- 如何在Python中反转列表?
如何在Python中执行以下操作? array = [0, 10, 20, 40] for (i = array.length() - 1; i >= 0; i--) 我需要一个数组的元素,但是 ...
- python set 排序_python set 排序_如何在Python中使用sorted()和sort()
点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基 著 18财税3班 李潇潇 译 日期:2019年5月6日 一. 使用sorted() ...
- python 参数个数 同名函数_如何在python中编写不同参数的同名方法
我在Java背景下学习Python(3.x). 我有一个python程序,我在其中创建一个personObject并将其添加到列表中.p = Person("John") list ...
- python if语句多个条件-关于函数:如何在python中为一个if语句提供多个条件
本问题已经有最佳答案,请猛点这里访问. 所以我在用python 3.1.5编写一些代码,这些代码需要有多个条件才能发生某些事情.例子: 1 2 3 4 5def example(arg1, arg2, ...
- python中range 10 0_如何在python中使用range方法
如何在python中使用range方法 发布时间:2021-01-05 16:55:23 来源:亿速云 阅读:94 作者:Leah 如何在python中使用range方法?很多新手对此不是很清楚,为了 ...
最新文章
- 分享在winform下实现左右布局多窗口界面
- 《数字视频和高清:算法和接口》一第2章 图像的采样和显示
- oracle基本概念和术语
- 深入浅出 SpringMVC - 2 提升篇
- 背完这444句,你的口语绝对不成问题了
- NYOJ 1066 CO-PRIME(数论)
- 基于海思开发板的屏幕截图程序(二)
- java jlabel里面加button_在Java Swing中通过JLabel覆盖JButton?
- 将一个字段分成3个 php,整理几个方法
- 【英语学习】【WOTD】orthography 释义/词源/示例
- 宝石光是什么石头_沙漠戈壁的漂亮“石头”让人见了流口水
- sql 查询超时已过期_监视来自SQL Server代理作业的查询超时过期消息
- 【深入篇】Android常用布局方式简介
- js默认点击一次_JavaScript初学者,一个小小的点击案例。
- hdu 4794 FIb求循环节
- 解决Ubuntu无法定位软件包问题
- 【转】鼠标右键多余菜单清理
- VMware Workstation安装Win7系统
- 解析:外部网页内如何一键复制微信号添加微信好友
- Android蓝牙协议介绍
热门文章
- 面试现场:小伙伴美团一面的分享和分析「含解答」
- DDD分层架构最佳实践
- 计算机网络原理超详解说
- 某女程序员吐槽:和男友准备结婚买房,男友家出首付,双方一起还贷款,男友却不在房产证上加她的名字!...
- 没想到,他面试竟然挂在了Spring的这个点上...
- 从一道面试题谈谈一线大厂码农应该具备的基本能力
- 头条创始人张一鸣没有任何大厂经验,是怎么做出这么厉害的产品的呢,以及管理这么大的团队呢?...
- 看板与Scrum:哪个更适合你的团队?
- ZED~Windows
- Windows 10安装Tensorflow