高效使用 Python 可视化工具 Matplotlib

Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。本文主要介绍了在学习Matplotlib时面临的一些挑战,为什么要使用Matplotlib,并推荐了一个学习使用Matplotlib的步骤。

简介

对于新手来说,进入Python可视化领域有时可能会令人感到沮丧。Python有很多不同的可视化工具,选择一个正确的工具有时是一种挑战。 例如,即使两年过去了,这篇《Overview of Python Visualization Tools》是引导人们到这个网站的顶级帖子之一。 在那篇文章中,我对matplotlib留下了一些阴影,并在分析过程中不再使用。 然而,在使用诸如pandas,scikit-learn,seaborn和其他数据科学技术栈的python工具后,觉得丢弃matplotlib有点过早了。说实话,之前我不太了解matplotlib,也不知道如何在工作流程中有效地使用。

现在我花时间学习了其中的一些工具,以及如何使用matplotlib,已经开始将matplotlib看作是不可或缺的工具了。这篇文章将展示我是如何使用matplotlib的,并为刚入门的用户或者没时间学习matplotlib的用户提供一些建议。我坚信matplotlib是python数据科学技术栈的重要组成部分,希望本文能帮助大家了解如何将matplotlib用于自己的可视化。

为什么对matplotlib都是负面评价?

在我看来,新用户学习matplotlib之所以会面临一定的挑战,主要有以下几个原因。

首先,matplotlib有两种接口。第一种是基于MATLAB并使用基于状态的接口。第二种是面向对象的接口。为什么是这两种接口不在本文讨论的范围之内,但是知道有两种方法在使用matplotlib进行绘图时非常重要。

两种接口引起混淆的原因在于,在stack overflow社区和谷歌搜索可以获得大量信息的情况下,新用户对那些看起来有些相似但不一样的问题,面对多个解决方案会感到困惑。从我自己的经历说起。回顾一下我的旧代码,一堆matplotlib代码的混合——这对我来说非常混乱(即使是我写的)。

关键点

matplotlib的新用户应该学习使用面向对象的接口。

matplotlib的另一个历史性挑战是,一些默认风格选项相当没有吸引力。 在R语言世界里,可以用ggplot生成一些相当酷的绘图,相比之下,matplotlib的选项看起来有点丑。令人欣慰的是matplotlib 2.0具有更美观的样式,以及非常便捷对可视化的内容进行主题化的能力。

使用matplotlib我认为第三个挑战是,当绘制某些东西时,应该单纯使用matplotlib还是使用建立在其之上的类似pandas或者seaborn这样的工具,你会感到困惑。任何时候都可以有多种方式来做事,对于新手或不常用matplotlib的用户来讲,遵循正确的路径是具有挑战性的。将这种困惑与两种不同的API联系起来,是解决问题的秘诀。

为什么坚持要用matplotlib?

尽管有这些问题,但是我庆幸有matplotlib,因为它非常强大。这个库允许创建几乎任何你可以想象的可视化。此外,围绕着它还有一个丰富的python工具生态系统,许多更先进的可视化工具用matplotlib作为基础库。如果在python数据科学栈中进行任何工作,都将需要对如何使用matplotlib有一个基本的了解。这是本文的其余部分的重点——介绍一种有效使用matplotlib的基本方法。

基本前提

如果你除了本文之外没有任何基础,建议用以下几个步骤学习如何使用matplotlib:

  1. 学习基本的matplotlib术语,尤其是什么是图和坐标轴
  2. 始终使用面向对象的接口,从一开始就养成使用它的习惯
  3. 用基础的pandas绘图开始你的可视化学习
  4. 用seaborn进行更复杂的统计可视化
  5. 用matplotlib来定制pandas或者seaborn可视化

这幅来自matplotlib faq的图非常经典,方便了解一幅图的不同术语。

大多数术语都非常直接,但要记住的要点是,Figure是最终的图像,可能包含一个或多个坐标轴。坐标轴代表一个单独的划分。一旦你了解这些内容,以及如何通过面向对象的API访问它们,下面的步骤才能开始进行。

这些术语知识有另一个好处,当你在网上看某些东西时,就有了一个起点。如果你花时间了解了这一点,才会理解matplotlib API的其余部分。此外,许多python的高级软件包,如seaborn和ggplot都依赖于matplotlib。因此,了解这些基础知识后再学那些功能更强大的框架会容易一些。

最后,我不是说你应该避免选择例如ggplot(aka ggpy),bokeh,plotly或者altair等其他更好的工具。我只是认为你需要从对matplotlib + pandas + seaborn 有一个基本了解开始。一旦理解了基本的可视化技术,就可以探索其他工具,并根据自己的需要做出明智的选择。

入门

本文的其余部分将作为一个入门教程,介绍如何在pandas中进行基本的可视化创建,并使用matplotlib自定义最常用的项目。一旦你了解了基本过程,进一步的定制化创建就相对比较简单。

重点讲一下我遇到的最常见的绘图任务,如标记轴,调整限制,更新绘图标题,保存图片和调整图例。

准备开始,我先引入库并读入一些数据:


  1. import pandas as pd 
  2. import matplotlib.pyplot as plt 
  3. from matplotlib.ticker import FuncFormatter 
  4.   
  5. df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=true") 
  6. df.head() 

这是2014年的销售交易数据。为了使这些数据简短一些,我将对数据进行聚合,以便我们可以看到前十名客户的总购买量和总销售额。为了清楚我还会在绘图中重新命名列。


  1. top_10 = (df.groupby('name')['ext price', 'quantity'].agg({'ext price': 'sum', 'quantity': 'count'}) 
  2.           .sort_values(by='ext price', ascending=False))[:10].reset_index() 
  3. top_10.rename(columns={'name': 'Name', 'ext price': 'Sales', 'quantity': 'Purchases'}, inplace=True) 

下面是数据的处理结果。

现在,数据被格式化成一个简单的表格,我们来看如何将这些结果绘制成条形图。

如前所述,matplotlib有许多不同的样式可用于渲染绘图,可以用plt.style.available查看系统中有哪些可用的样式。


  1. plt.style.available 


  1. ['seaborn-dark', 
  2.  
  3. 'seaborn-dark-palette', 
  4.  
  5. 'fivethirtyeight', 
  6.  
  7. 'seaborn-whitegrid', 
  8.  
  9. 'seaborn-darkgrid', 
  10.  
  11. 'seaborn', 
  12.  
  13. 'bmh', 
  14.  
  15. 'classic', 
  16.  
  17. 'seaborn-colorblind', 
  18.  
  19. 'seaborn-muted', 
  20.  
  21. 'seaborn-white', 
  22.  
  23. 'seaborn-talk', 
  24.  
  25. 'grayscale', 
  26.  
  27. 'dark_background', 
  28.  
  29. 'seaborn-deep', 
  30.  
  31. 'seaborn-bright', 
  32.  
  33. 'ggplot', 
  34.  
  35. 'seaborn-paper', 
  36.  
  37. 'seaborn-notebook', 
  38.  
  39. 'seaborn-poster', 
  40.  
  41. 'seaborn-ticks', 
  42.  
  43. 'seaborn-pastel'] 

这样简单使用一个样式:


  1. plt.style.use('ggplot') 

我鼓励大家尝试不同的风格,看看你喜欢哪些。

现在我们准备好了一个更美观的样式,第一步是使用标准的pandas绘图功能绘制数据:


  1. top_10.plot(kind='barh', y="Sales", x="Name") 

我推荐先使用pandas绘图,是因为它是一种快速简便构建可视化的方法。 由于大多数人可能已经在pandas中进行过一些数据处理/分析,所以请先从基本的绘图开始。

定制化绘图

假设你对这个绘图的要点很满意,下一步就是定制它。使用pandas绘图功能定制(如添加标题和标签)非常简单。但是,你可能会发现自己的需求在某种程度上超越该功能。这就是我建议养成这样做的习惯的原因:


  1. fig, ax = plt.subplots() 
  2. top_10.plot(kind='barh', y="Sales", x="Name", ax=ax) 

得到的图看起来与原始图看起来相同,但是我们向plt.subplots() 添加了一个额外的调用,并将ax传递给绘图函数。为什么要这样做? 记得当我说在matplotlib中要访问坐标轴和数字至关重要吗?这就是我们在这里完成的工作。将来任何定制化都将通过ax或fig对象完成。

我们得益于pandas快速绘图,获得了访问matplotlib的所有权限。我们现在可以做什么呢?用一个例子来展示。另外,通过命名约定,可以非常简单地把别人的解决方案改成适合自己独特需求的方案。

假设我们要调整x限制并更改一些坐标轴的标签?现在坐标轴保存在ax变量中,我们有很多的控制权:


  1. fig, ax = plt.subplots()  
  2. top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)  
  3. ax.set_xlim([-10000, 140000])  
  4. ax.set_xlabel('Total Revenue')  
  5. ax.set_ylabel('Customer'); 

下面是一个快捷方式,可以用来更改标题和两个标签:


  1. Python  
  2. fig, ax = plt.subplots()  
  3. top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)  
  4. ax.set_xlim([-10000, 140000])  
  5. ax.set(title='2014 Revenue', xlabel='Total Revenue', ylabel='Customer') 

为了进一步验证这种方法,还可以调整图像的大小。通过plt.subplots() 函数,可以用英寸定义figsize。也可以用ax.legend().set_visible(False)来删除图例。


  1. fig, ax = plt.subplots(figsize=(5, 6))  
  2. top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)  
  3. ax.set_xlim([-10000, 140000])  
  4. ax.set(title='2014 Revenue', xlabel='Total Revenue')  
  5. ax.legend().set_visible(False) 

基于很多原因你可能想要调整一下这个图。看着最别扭的地方是总收入数字的格式。 Matplotlib可以通过FuncFormatter来帮我们实现。这个功能可以将用户定义的函数应用于值,并返回一个格式整齐的字符串放置在坐标轴上。

下面是一个货币格式化函数,可以优雅地处理几十万范围内的美元格式:


  1. def currency(x, pos): 
  2.     'The two args are the value and tick position' 
  3.     if x >= 1000000: 
  4.         return '${:1.1f}M'.format(x*1e-6) 
  5.     return '${:1.0f}K'.format(x*1e-3) 

现在我们有一个格式化函数,需要定义它并将其应用到x轴。以下是完整的代码:


  1. fig, ax = plt.subplots() 
  2. top_10.plot(kind='barh', y="Sales", x="Name", ax=ax) 
  3. ax.set_xlim([-10000, 140000]) 
  4. ax.set(title='2014 Revenue', xlabel='Total Revenue', ylabel='Customer') 
  5. formatter = FuncFormatter(currency) 
  6. ax.xaxis.set_major_formatter(formatter) 
  7. ax.legend().set_visible(False) 

这样更美观,也是一个很好的例子,展示如何灵活地定义自己的问题解决方案。

我们最后要去探索的一个自定义功能是通过添加注释到绘图。绘制一条垂直线,可以用ax.axvline()。添加自定义文本,可以用ax.text()。

在这个例子中,我们将绘制一条平均线,并显示三个新客户的标签。 下面是完整的代码和注释,把它们放在一起。


  1. # Create the figure and the axes 
  2. fig, ax = plt.subplots() 
  3.  
  4.  
  5. # Plot the data and get the averaged 
  6.  
  7. top_10.plot(kind='barh', y="Sales", x="Name", ax=ax) 
  8.  
  9. avg = top_10['Sales'].mean() 
  10.  
  11.   
  12.  
  13. # Set limits and labels 
  14.  
  15. ax.set_xlim([-10000, 140000]) 
  16.  
  17. ax.set(title='2014 Revenue', xlabel='Total Revenue', ylabel='Customer') 
  18.  
  19.   
  20.  
  21. # Add a line for the average 
  22.  
  23. ax.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1) 
  24.  
  25.   
  26.  
  27. # Annotate the new customers 
  28.  
  29. for cust in [3, 5, 8]: 
  30.  
  31.     ax.text(115000, cust, "New Customer") 
  32.  
  33.   
  34.  
  35. # Format the currency 
  36.  
  37. formatter = FuncFormatter(currency) 
  38.  
  39. ax.xaxis.set_major_formatter(formatter) 
  40.  
  41.   
  42.  
  43. # Hide the legend 
  44.  
  45. ax.legend().set_visible(False) 

虽然这可能不是让人感到兴奋(眼前一亮)的绘图方式,但它展示了你在用这种方法时有多大权限。

图形和图像

到目前为止,我们所做的所有改变都是单个图形。幸运的是,我们也有能力在图上添加多个图形,并使用各种选项保存整个图像。

如果决定要把两幅图放在同一个图像上,我们应对如何做到这一点有基本了解。 首先,创建图形,然后创建坐标轴,然后将其全部绘制在一起。我们可以用plt.subplots()来完成:


  1. fig, (ax0, ax1) = plt.subplots(nrows=1, ncols=2, sharey=True, figsize=(7, 4)) 

在这个例子中,用nrows和ncols来指定大小,这样对新用户来说比较清晰。在示例代码中,经常看到像1,2这样的变量。我觉得使用命名的参数,之后在查看代码时更容易理解。

用sharey = True这个参数,以便yaxis共享相同的标签。

这个例子也很好,因为各个坐标轴被解压缩到ax0和ax1。有这些坐标轴轴,你可以像上面的例子一样绘制图形,但是在ax0和ax1上各放一个图。

Python


  1. # Get the figure and the axes 
  2.  
  3. fig, (ax0, ax1) = plt.subplots(nrows=1,ncols=2, sharey=True, figsize=(7, 4)) 
  4.  
  5. top_10.plot(kind='barh', y="Sales", x="Name", ax=ax0) 
  6.  
  7. ax0.set_xlim([-10000, 140000]) 
  8.  
  9. ax0.set(title='Revenue', xlabel='Total Revenue', ylabel='Customers') 
  10.  
  11.   
  12.  
  13. # Plot the average as a vertical line 
  14.  
  15. avg = top_10['Sales'].mean() 
  16.  
  17. ax0.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1) 
  18.  
  19.   
  20.  
  21. # Repeat for the unit plot 
  22.  
  23. top_10.plot(kind='barh', y="Purchases", x="Name", ax=ax1) 
  24.  
  25. avg = top_10['Purchases'].mean() 
  26.  
  27. ax1.set(title='Units', xlabel='Total Units', ylabel='') 
  28.  
  29. ax1.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1) 
  30.  
  31.   
  32.  
  33. # Title the figure 
  34.  
  35. fig.suptitle('2014 Sales Analysis', fontsize=14, fontweight='bold'); 
  36.  
  37.   
  38.  
  39. # Hide the legends 
  40.  
  41. ax1.legend().set_visible(False) 
  42.  
  43. ax0.legend().set_visible(False) 

到目前为止,我一直用jupyter notebook,借助%matplotlib内联指令来显示图形。但是很多时候,需要以特定格式保存数字,和其他内容一起展示。

Matplotlib支持许多不同格式文件的保存。 你可以用fig.canvas.get_supported_filetypes()查看系统支持的格式:


  1. fig.canvas.get_supported_filetypes() 

  1. {'eps': 'Encapsulated Postscript', 
  2.  
  3. 'jpeg': 'Joint Photographic Experts Group', 
  4.  
  5. 'jpg': 'Joint Photographic Experts Group', 
  6.  
  7. 'pdf': 'Portable Document Format', 
  8.  
  9. 'pgf': 'PGF code for LaTeX', 
  10.  
  11. 'png': 'Portable Network Graphics', 
  12.  
  13. 'ps': 'Postscript', 
  14.  
  15. 'raw': 'Raw RGBA bitmap', 
  16.  
  17. 'rgba': 'Raw RGBA bitmap', 
  18.  
  19. 'svg': 'Scalable Vector Graphics', 
  20.  
  21. 'svgz': 'Scalable Vector Graphics', 
  22.  
  23. 'tif': 'Tagged Image File Format', 
  24.  
  25. 'tiff': 'Tagged Image File Format'} 

由于我们有fig对象,我们可以用多个选项来保存图像:


  1. fig.savefig('sales.png', transparent=False, dpi=80, bbox_inches="tight") 

上面的代码把图像保存为背景不透明的png。还指定了分辨率dpi和bbox_inches =“tight”来尽量减少多余的空格。

结论

希望这个过程有助于你了解如何在日常的数据分析中更有效地使用matplotlib。 如果在做分析时养成使用这种方法的习惯,你应该可以快速定制出任何你需要的图像。

作为最后的福利,我引入一个快速指南来总结所有的概念。希望这有助于把这篇文章联系起来,并为今后使用参考提供方便。

  

本文作者:Chris Moffitt

来源:51CTO

时间: 2024-09-29 06:43:48

高效使用 Python 可视化工具 Matplotlib的相关文章

高效使用Python可视化工具Matplotlib

Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表.本文主要介绍了在学习Matplotlib时面临的一些挑战,为什么要使用Matplotlib,并推荐了一个学习使用Matplotlib的步骤. 简介 对于新手来说,进入Python可视化领域有时可能会令人感到沮丧.Python有很多不同的可视化工具,选择一个正确的工具有时是一种挑战. 例如,即使两年过去了,这篇<Overview of Python Visualization To

7 款 Python 可视化工具对比

Python 的科学栈相当成熟,各种应用场景都有相关的模块,包括机器学习和数据分析.数据可视化是发现数据和展示结果的重要一环,只不过过去以来,相对于 R 这样的工具,发展还是落后一些. 幸运的是,过去几年出现了很多新的Python数据可视化库,弥补了一些这方面的差距.matplotlib 已经成为事实上的数据可视化方面最主要的库,此外还有很多其他库,例如vispy,bokeh, seaborn,  pyga, folium 和 networkx,这些库有些是构建在 matplotlib 之上,还

你要的Python可视化工具都在这里

声明:本文是对这篇文章的总结,所有的例子都在本地实际运行过,并修复了原文中一些在python 3下运行时的bug. 本人微博:珞珈学渣,本人博客:博客原文简介 python的第三方包有多个选项来可视化数据,这给了我们更多的选择空间,但也正是由于这种多样性,确定使用哪一个可视化工具来完成任务时有挑战性.本文包含一些更受欢迎的示例,并说明如何使用它们来创建一个简单的条形图.本文使用到的数据,可以通过这个链接下载.我将分别使用下边的工具创建统计图形: Pandas Seaborn ggplot Bok

Python数据可视化2.7 Python中的可视化工具

2.7 Python中的可视化工具 数据分析和可视化需要一些软件工具:用一个文本编辑器来写代码(最好语法高亮),用Python和其他库来运行和测试代码,可能还要用一个工具展示这些结果.现有两种软件工具:通用的软件工具和特定软件组件. 开发工具 通用的软件工具是集成开发环境(integrated development environment,IDE),这是一种同一软件包内囊括所有生产工具的应用程序.从处理Python库的角度来看,这些IDE通常非常方便.有关IDE工具的更多细节将在下一章讨论.本

python的绘图工具matplotlib使用实例_python

matplotlib是功能十分强大的绘制二维图形的Python模块,它用Python语言实现了MATLAB画图函数的易用性,同时又有非常强大的可定制性.它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.它的文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源程序.因此如果你需要绘制某种类型的图,只需要在这个页面中浏览.复制.粘贴一下,基本上都能搞定! 实例代码如下: 1. 柱状图 import matp

数据可视化工具大集合

所谓数据可视化是对大型数据库或数据仓库中的数据的可视化,它是可视化技术在非空间数据领域的应用,使人们不再局限于通过关系数据表来观察和分析数据信息,还能以更直观的方式看到数据及其结构关系. 数据可视化技术的基本思想是将数据库中每一个数据项作为单个图元元素表示,大量的数据集构成数据图像, 同时将数据的各个属性值以多维数据的形式表示,可以从不同的维度观察数据,从而对数据进行更深入的观察和分析. 内容目录 Awesome dataviz JavaScript 工具 图表库 图形图表库 地图(Maps)

Python机器学习工具:Scikit-Learn介绍与实践

本文讲的是Python机器学习工具:Scikit-Learn介绍与实践, Scikit-learn官方的解释很简单: Machine Learning in Python, 用python来玩机器学习. 什么是机器学习 机器学习关注的是:计算机程序如何随着经验积累自动提高性能.而最大的吸引力在于,不需要写任何与问题相关的特定代码,泛型算法就能告诉你一些关于数据的秘密. Scikit-learn的优点 构建于现有的NumPy(基础n维数组包),SciPy(科学计算基础包), matplotlib(

《Python数据分析与挖掘实战》一2.3 Python数据分析工具

2.3 Python数据分析工具 Python本身的数据分析功能不强,需要安装一些第三方扩展库来增强它的能力.本书用到的库有Numpy.Scipy.Matplotlib.Pandas.Scikit-Learn.Keras和Gensim等,下面将对这些库的安装和使用进行简单的介绍. 如果读者安装的是Anaconda发行版,那么它已经自带了以下库:Numpy.Scipy.Mat-plotlib.Pandas和Scikit-Learn. 本章主要是对这些库进行简单的介绍,在后面的章节中,会通过各种案例

20个数据可视化工具点评

如今学习应用数据可视化的渠道有很多,你可以跟踪一些专家博客,但更重要的一点是实践/实操,你必须对目前可用的数据可视化工具有个大致了解.以下是Netmagzine列举的二十大数据可视化工具,无论你是准备制作简单的图表还是复杂的图谱或者信息图,这些工具都能满足你的需要.更加美妙的是,这些工具大多免费. 第一部分:入门级工具 1.Excel Excel的图形化功能并不强大,但Excel是分析数据的理想工具,上图是Excel生成的热力地图 作为一个入门级工具,Excel是快速分析数据的理想工具,也能创建