原文地址: !()[http://www.bugingcode.com/blog/Matplotlib_7_Effectively_Using.html]

这是一篇关于如何高效的使用Matplotlib 的文章,文章的地址在 原文,但是这里不准备一行一行的对文章的内容进行翻译,而是把主要的步骤和思想都记录下来,在进行项目绘制的时候能够有很好的帮助。

获取数据和数据格式

要进行数据的绘制时,数据一般存放在文档里,比如cvs或者是excel中,读取时使用 pandas 进行操作,这里 下有专门的介绍,这里不在详细的介绍了。

数据从 https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=true 中得到,这里看看数据的读取和格式:

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import pandas as pd
from matplotlib.ticker import FuncFormatter df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=true")
print df.head()

这里打印出sample-salesv3.xlsx 中前面4行的数据,数据的格式如下所示:

商品id,商品名称,商品sku,销售数量,销售单价,产品销售额,时间。

数据排行和展示

我们想知道哪些商品的销售最高,需要对数据进行排序,并取到前10位:

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import pandas as pd
from matplotlib.ticker import FuncFormatter df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=true")
#对ext price 进行排序,并取得前10位
top_10 = (df.groupby('name')['ext price', 'quantity'].agg({'ext price': 'sum', 'quantity': 'count'})
.sort_values(by='ext price', ascending=False))[:10].reset_index()
#重新命名 ext price 换成 Sales,quantity 换成 Purchases
top_10.rename(columns={'name': 'Name', 'ext price': 'Sales', 'quantity': 'Purchases'}, inplace=True) print top_10

结果如下:

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

取出了前面10名的销售额,第一位为 Kulas Inc,第二位White-Trantow ,等。

在图表上对这些数据进行绘制:

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import pandas as pd
from matplotlib.ticker import FuncFormatter df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=true")
#对ext price 进行排序,并取得前10位
top_10 = (df.groupby('name')['ext price', 'quantity'].agg({'ext price': 'sum', 'quantity': 'count'})
.sort_values(by='ext price', ascending=False))[:10].reset_index()
#重新命名 ext price 换成 Sales,quantity 换成 Purchases
top_10.rename(columns={'name': 'Name', 'ext price': 'Sales', 'quantity': 'Purchases'}, inplace=True) plt.style.use('ggplot') top_10.plot(kind='barh', y="Sales", x="Name") plt.show()

得到各个商品的销售额:

图表自定义

自定义在图表的绘制中起到了美化和增强可读性的作用,对图表的说明和样式的改变,能够使你的图表看上去专业很多。

对图表的说明和坐标范围限制:

把上面 top_10.plot(kind='barh', y="Sales", x="Name") 代码更换为以下的代码,代码的功能也很清楚,限制x轴坐标,设置标题,x轴说明:

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

得到的结果图如下:

要想修改这个图像,你可能需要执行很多操作。图中最碍眼的可能是总收益额的格式。Matplotlib 可以使用 FuncFormatter 解决这一问题。该函数用途多样,允许用户定义的函数应用到值,并返回格式美观的字符串。

以下是货币格式化函数,用于处理数十万美元区间的数值:

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

对x轴数据格式进行说明:

formatter = FuncFormatter(currency)
ax.xaxis.set_major_formatter(formatter)

同样的总的代码是把plot的代码替换为如下:

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

对x轴进行修饰以后的图表:

多图表对比

各个销售的对比和各个商品在整体中是处于哪个地位是较为关心的话题。把平均值也绘制在图表中,可以很方便的进行对比。

# Create the figure and the axes
fig, ax = plt.subplots() # Plot the data and get the averaged
top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)
avg = top_10['Sales'].mean() # Set limits and labels
ax.set_xlim([-10000, 140000])
ax.set(title='2014 Revenue', xlabel='Total Revenue', ylabel='Customer') # Add a line for the average
ax.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1) # Format the currency
formatter = FuncFormatter(currency)
ax.xaxis.set_major_formatter(formatter) # Hide the legend
ax.legend().set_visible(False)

图表如下:

目前,我们所做的所有改变都是针对单个图表。我们还能够在图像上添加多个表,使用不同的选项保存整个图像。

在这个例子中,我使用 nrows 和 ncols 指定大小,这对新用户来说比较清晰易懂。我还使用 sharey=True 以使 y 轴共享相同的标签。

该示例很灵活,因为不同的轴可以解压成 ax0 和 ax1。现在我们有了这些轴,就可以像上述示例中那样绘图,然后把一个图放在 ax0 上,另一个图放在 ax1。

# Get the figure and the axes
fig, (ax0, ax1) = plt.subplots(nrows=1,ncols=2, sharey=True, figsize=(7, 4))
top_10.plot(kind='barh', y="Sales", x="Name", ax=ax0)
ax0.set_xlim([-10000, 140000])
ax0.set(title='Revenue', xlabel='Total Revenue', ylabel='Customers') # Plot the average as a vertical line
avg = top_10['Sales'].mean()
ax0.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1) # Repeat for the unit plot
top_10.plot(kind='barh', y="Purchases", x="Name", ax=ax1)
avg = top_10['Purchases'].mean()
ax1.set(title='Units', xlabel='Total Units', ylabel='')
ax1.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1) # Title the figure
fig.suptitle('2014 Sales Analysis', fontsize=14, fontweight='bold'); # Hide the legends
ax1.legend().set_visible(False)
ax0.legend().set_visible(False)

保存图表

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

fig.canvas.get_supported_filetypes()

	{'eps': 'Encapsulated Postscript',
'jpeg': 'Joint Photographic Experts Group',
'jpg': 'Joint Photographic Experts Group',
'pdf': 'Portable Document Format',
'pgf': 'PGF code for LaTeX',
'png': 'Portable Network Graphics',
'ps': 'Postscript',
'raw': 'Raw RGBA bitmap',
'rgba': 'Raw RGBA bitmap',
'svg': 'Scalable Vector Graphics',
'svgz': 'Scalable Vector Graphics',
'tif': 'Tagged Image File Format',
'tiff': 'Tagged Image File Format'}

我们有 fig 对象,因此我们可以将图像保存成多种格式:

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

转载请标明来之:http://www.bugingcode.com/

更多教程:阿猫学编程

Matplotlib绘图库入门(七):高效使用的更多相关文章

  1. Python图表绘制:matplotlib绘图库入门

    matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...

  2. Python图表绘制:matplotlib绘图库入门(转)

    matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...

  3. 使用 Python 的 matplotlib 绘图库进行绘图

    matplotlib 是 Python 最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 1  使用 Ma ...

  4. Python Matplotlib绘图库 安装

    一般我们在做科学计算的时候,首先会想到的是matlab,但是呢,一想到matlab安装包那么大,我就有点不想说什么了. Matplotlib 是python最著名的绘图库,它提供了一整套和matlab ...

  5. Python第三方库matplotlib(2D绘图库)入门与进阶

    Matplotlib 一 简介: 二 相关文档: 三 入门与进阶案例 1- 简单图形绘制 2- figure的简单使用 3- 设置坐标轴 4- 设置legend图例 5- 添加注解和绘制点以及在图形上 ...

  6. Python 绘图库Matplotlib入门教程

    0 简单介绍 Matplotlib是一个Python语言的2D绘图库,它支持各种平台,并且功能强大,能够轻易绘制出各种专业的图像. 1 安装 pip install matplotlib 2 入门代码 ...

  7. 23、matplotlib数据可视化、绘图库模块

    matplotlib官方文档:https://matplotlib.org/contents.html?v=20190307135750 matplotlib是一个绘图库,它可以创建常用的统计图,包括 ...

  8. matplotlib python高级绘图库 一周总结

    matplotlib python高级绘图库 一周总结 官网 http://matplotlib.org/ 是一个python科学作图库,可以快速的生成很多非常专业的图表. 只要你掌握要领,画图将变得 ...

  9. Matplotlib Toolkits:python高级绘图库seaborn

    http://blog.csdn.net/pipisorry/article/details/49515745 Seaborn介绍 seaborn (Not distributed with matp ...

随机推荐

  1. teminal / console / shell

    console从应用程序角度看的(控制台是管理员用的,唯一的) teminal从用户角度看的(终端是用户用的) 应用程序与console交互 用户与teminal交互 teminal可以不存在 tem ...

  2. [HEOI2013]ALO(可持久化Trie+链表)

    你永远不会相信一个快AFO的选手不会可持久化Trie. 其实异或粽子那题可以用可持久化Trie做,不过我还是没用,用的一般的Trie(其实可持久化是多此一举),于是到现在还是不会可持久化Trie. 这 ...

  3. 获取文件MD5值(JS、JAVA)

    文章HTML代码翻译于地址:https://www.cnblogs.com/linyihai/p/7040786.html           文件MD5有啥用?                  文 ...

  4. JS中的let变量

    介绍JS中的let变量: let允许你声明一个作用域被限制在块级中的变量.语句或者表达式.在Function中局部变量推荐使用let变量,避免变量名冲突. 作用域规则 let 声明的变量只在其声明的块 ...

  5. visual studio2019下动态链接库的制作

    打开visual studio2019创建动态链接库项目,项目名称为20199324dll 然后定义宏:在头文件中定义即可,宏的作用的是允许该函数能够被外部访问,并直接调用.代码如下: // pch. ...

  6. SQL服务器攻击总结-注入

    查库选择convert(int,db_name())sysobjects 查当前表id,从sysobjects中选择id,xtype ='u'//此处要记录下数据库的id syscolumns查表对应 ...

  7. 【转】浅述WinForm多线程编程与Control.Invoke的应用

    环境:VS2008.C#3.0 在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的 ...

  8. sqlite如何避免重复建表(获取已经存在的表)

    找到已经存在的所有表,手动判断是否需要建表 SELECT name FROM SQLITE_MASTER WHERE type='table'ORDER BY name" 建表时sqlite ...

  9. python基础——认识(if __name__ == ‘__main__’:)

    我们在写代码时,经常会用到这一句:if __name__ == '__main__',那么加这一句有什么用呢?实际上,它起到到了一个代码保护功能,它能够让别人在导入你写的模块情况下,无法看到和运行if ...

  10. [ZJOI2019]Minimax搜索(线段树+动态DP+树剖)

    为什么我怎么看都只会10pts?再看还是只会50~70?只会O(n2(R-L+1))/O(nlogn(R-L+1))……一眼看动态DP可还是不会做…… 根节点的答案是叶子传上来的,所以对于L=R的数据 ...