zoukankan      html  css  js  c++  java
  • Python 可视化工具 Matplotlib

    英文出处:Chris Moffitt

    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自定义最常用的项目。一旦你了解了基本过程,进一步的定制化创建就相对比较简单。

    重点讲一下我遇到的最常见的绘图任务,如标记轴,调整限制,更新绘图标题,保存图片和调整图例。如果你想跟着继续学习,在链接https://github.com/chris1610/pbpython/blob/master/notebooks/Effectively-Using-Matplotlib.ipynb 中包含附加细节的笔记,应该非常有用。

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

    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()
    account numbernameskuquantityunit priceext pricedate
    0 740150 Barton LLC B1-20000 39 86.69 3380.91 2014-01-01 07:21:51
    1 714466 Trantow-Barrows S2-77896 -1 63.16 -63.16 2014-01-01 10:00:47
    2 218895 Kulas Inc B1-69924 23 90.70 2086.10 2014-01-01 13:24:58
    3 307599 Kassulke, Ondricka and Metz S1-65481 41 21.05 863.05 2014-01-01 15:05:22
    4 412290 Jerde-Hilpert S2-34077 6 83.21 499.26 2014-01-01 23:26:55

    这是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)

    下面是数据的处理结果。

     NamePurchasesSales
    0 Kulas Inc 94 137351.96
    1 White-Trantow 86 135841.99
    2 Trantow-Barrows 94 123381.38
    3 Jerde-Hilpert 89 112591.43
    4 Fritsch, Russel and Anderson 81 112214.71
    5 Barton LLC 82 109438.50
    6 Will LLC 74 104437.60
    7 Koepp Ltd 82 103660.54
    8 Frami, Hills and Schmidt 72 103569.59
    9 Keeling LLC 74 100934.30

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

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

  • 相关阅读:
    进程池的使用
    同步提交,异步提交
    协程
    单线程下实现并发的套接字
    批量上传
    TP中的session和cookie
    ajaxReturn
    ajax的两种方式
    Yii里表单的操作方法(展示渲染待续......)
    Yii里文件上传的操作方法(图片修改,在详情上展示,批量上传待续...)
  • 原文地址:https://www.cnblogs.com/wangwei916797941/p/7220632.html
Copyright © 2011-2022 走看看