《Python绘图利器》:Matplotlib使用教程

1. 前言

本文是Matplotlib库的学习使用文章,包含Matplotlib的介绍,安装以及如何绘图等详细的教程。也可以作为Matplotlib绘图手册,在需要的使用翻阅查看。

2. Matplotlib简介

MatplotlibMatlab启发(绘图方式十分相似),由各种可视化类构成,其内部结构十分复杂,为了方便用户使用,提供了Matplotlib.pyplot作为python绘图的子库,提供绘制各类可视化图形的命令。

pyplot相当于提供了底层绘图的一个快捷方式,用简单的方式去调用复杂模块

一般情况下,我们采用如下的方式导入pyplot

import matplotlib.pyplot as plt

下面展示了Matplotlib绘制的部分图形:

3. 安装

Matplotlib的安装十分简单,只要本地安装了python环境和pip安装工具,用下面的命令即可安装:

pip install matplotlib

4. 绘图基础

4.1 plot()函数

plot(x,y,format_string,**kwargs)pyplot绘图的基础函数,其中各参数含义如下:

  • x:X轴数据,列表或数组(单条曲线可选)
  • y:Y轴数据,列表或数组
  • format_string:控制曲线的格式字符串,用于填充曲线信息(可选),包含颜色,风格,标记三种字符,对应可选参数如下:
    字符类型 参数 说明
    颜色字符 'b' 蓝色
    'g' 绿色
    'r' 红色
    'c' 青绿色
    'm' 洋红色
    'y' 黄色
    'k' 黑色
    'w' 白色
    '#000000' 按RGB取色
    '0.6' 灰度值
    风格字符 '-' 实线
    '--' 破折线
    '-.' 点划线
    ':' 虚线
    '' '' 无线条
    标记字符 '.' 点标记
    'o' 实心圈标记
    '^' 上三角标记

标记字符还有很多种类型,这里不一一列出,下面是几个曲线样例:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)
plt.plot(x,x*2,'b-.',x,x*3,'r*',x,x*4,'y-.^')  # 1:蓝色实线点标记,2:红色`*`标记,3:黄色虚线上三角标记
plt.show()

  • **kwargs:更多的曲线参数(x,y,format_string)

4.1.1 中文显示

pyplot标签本身并不支持中文字体,可以通过在label中添加fontproperties属性修改字体,fontsize设置字体大小,但首先需要保证有对应字体,如果提示没有,则需下载并进行安装,具体可以参考这篇文章

jupyter 需要重启一下服务显示

中文显示样例如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)
plt.xlabel('我是横轴',fontproperties='Simhei',fontsize=10)
plt.ylabel('我是纵轴',fontproperties='Simhei',fontsize=10)
plt.plot(x,x*2,'b-.')
plt.show()

显示中文标签的方法还有修改rcParams参数,但这种方式是全局式的修改,统一所有字体,根据自身需要取舍。实现也很容易,在程序开头添加如下代码:

plt.rcParams['font.sans-serif'] = ['SimHei']

4.1.2 文本显示

除了绘图之外,我们还需要给图像做一定的说明文字信息,一般包括如下几个文本显示函数:

函数 说明
plt.xlabel() x轴文字
plt.ylabel() y轴文字
plt.title() 图像标题文本
plt.text() 任意位置添加文本
plt.annotate() 添加带箭头的注释

下面是一个较为详细的例子:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0,10,0.1)
plt.xlabel('我是横轴',fontsize=15,color='r')
plt.ylabel('我是纵轴',fontsize=15,color='b')
plt.title('正弦曲线$y=sin(2\pi x)$',fontsize=12)
plt.text(5,1,'(5,1)',fontsize=12)  # 在(5,1)处添加文本信息
plt.annotate('看这里',xy=(3,-1),xytext=(4,-1.5),  
             arrowprops={'facecolor':'k','shrink':0.1,'width':1.5})  # 设置指示箭头
plt.ylim(-2,2)  # 设置y轴上下限

plt.plot(x,np.sin(2*np.pi*x),'b-.')
plt.grid(True)  # 显示网格
plt.show()

5. 常用图表绘制

前文已经说明了一般的曲线图绘制,本章讲述其他几种常用的图表绘制方法,每个图表都将先给一个简单的绘图样例(用于快速查询绘制),再详细讲解函数参数信息并给出更为丰富的绘制方法与效果。

5.1 直方图

适用数值对比

5.1.1 简单样例

  • 效果
  • 代码
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.random.randint(0,50,50)  
    bins = np.arange(0,51,10)  # 设置直方图分布区间[0-50],10为间距
    
    plt.hist(x,bins,color="darkgreen")
    plt.title('学生成绩分布图',fontproperties='SimHei', fontsize=15)
    plt.xlabel('成绩',fontproperties='SimHei', fontsize=15)
    plt.ylabel('人数',fontproperties='SimHei', fontsize=15)
    plt.xlim(-10,60)  # 设置x轴区间范围,空出一些
    
    plt.show()

    5.1.2 函数定义

    Matplotlib中绘制直方图的函数是plt.hist(),详细定义如下:
def hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', 
align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)[source]
参数(加粗为常用参数) 含义
x 输入数据,接受数组或列表
bins 区间分布设置(设定一个总区间和区间长度)
range bins的上下限,如果没有设置默认为x.min(),x.max()
density 显示统计频率,默认为False,为True则y轴显示频率
histtype 直方图类型,可选bar(默认),barstacked,step(梯状),stepfilled四种
align 控制直方图水平分布,可选left,mid(默认),right

其他参数基本用不到,在需要的时候可查阅官方文档

5.1.3 正态分布直方图

  • 效果
  • 代码
    import numpy as np
    import matplotlib.pyplot as plt
    
    # Fixing random state for reproducibility
    np.random.seed(20200306)
    
    mu, sigma = 50, 20  # 均值和方差
    x = mu + sigma * np.random.randn(10000)
    
    # the histogram of the data
    plt.hist(x, 50, density=True, facecolor='g', alpha=0.75)
    
    plt.xlabel('Smarts')
    plt.ylabel('Probability')
    plt.title('Histogram of IQ')
    plt.text(25, .023, r'$\mu=50,\ \sigma=20$')
    plt.xlim(-40, 160)
    plt.ylim(0, 0.03)
    plt.grid(True)
    plt.show()

5.2 饼状图

适用比例区分

5.2.1 简单样例

  • 效果

  • 代码

    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei'] 
    labels = ('语文','数学','英语','物理')
    x = [20,30,25,25]  # 按100比例分配
    explode = (0.2,0.1,0,0)  # 距离中心距离
    
    plt.pie(x,explode=explode,labels=labels,autopct='%.2f',
    shadow = False, startangle=45)
    plt.show()

5.2.2 函数定义

Matplotlib中绘制饼图的函数是plt.pie(),完整的函数定义和参数如下:

def pie(x, explode=None, labels=None, colors=None, autopct=None,
pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None,
radius=None, counterclock=True, wedgeprops=None, textprops=None,
center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None)

参数(加粗为常用参数) 含义
x (每一块)的比例,如果sum(x) > 1会使用sum(x)归一化
explode (每一块)离开中心距离
labels (每一块)饼图外侧显示的说明文字
colors 自定义颜色,列表,如[‘red’,’yellow’]
autopct 控制饼图内百分比设置,可以使用format字符串或者format function
pctdistance 类似于labeldistance,指定autopct的位置刻度,默认值为0.6
shadow 在饼图下面画一个阴影。默认值:False,即不画阴影
labeldistance label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧
startangle 起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起
radius 控制饼图半径,默认值为1
counterclock 指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针
wedgeprops 字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={‘linewidth’:3},设置wedge线宽为3
textprops 设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
center 浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置
frame 布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
rotatelabels 布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度

5.2.3 添加图例

  • 效果
  • 代码

    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei'] 
    labels = ('语文','数学','英语','物理')
    x = [20,30,25,25]  # 按100比例分配
    explode = (0.2,0.1,0,0)  # 距离中心距离
    
    plt.pie(x,explode=explode,labels=labels,autopct='%.2f%%',  # 添加了百分号
    shadow = False, startangle=45)
    
    plt.axis('equal')  # 摆正
    plt.legend(loc="upper right", fontsize = 15, bbox_to_anchor=(1.1,1.2),borderaxespad=0.3)  
    # loc :  'upper right' 位于右上角
    # bbox_to_anchor: 上边距
    # borderaxespad: 图例的内边距
    plt.show()

这里仅给出了常用饼图绘制法,更多详细内容参考matplotlib 知识点11:绘制饼图(pie 函数精讲)

5.3 散点图

适用数据点分布

在对大量数据进行分类的时候采用散点图的方式能够让我们直观地感受到有几种类型。

散点图本身也是数据点的集合,因此可以采用plot函数或plt.scatter实现

5.3.1 简单样例

plot实现

  • 效果
import matplotlib.pyplot as plt
import numpy as np
plt.plot(np.random.randint(0,100,50),np.random.randint(0,100,50),'o')
plt.title('Scatter')

plt.show()

plt.scatter实现

  • 效果
import matplotlib.pyplot as plt
import numpy as np

x = np.random.randn(100)
y = np.random.randn(100)

plt.scatter(x,y, alpha=0.4)
plt.title('plt.scatter')

plt.show()

5.3.2 函数定义

plt.scatter()函数定义如下:

def scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None,
alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)

参数 含义
x 点横坐标
y 点纵坐标(大小与x相等)
s 标记大小,指定点的大小
c 标记颜色(如’red’,’r’)
maker 标记样式,如’o’是圆圈,’x’是叉号
alpha 透明度

5.3.3 多个点集

散点图中可能有两类或以上不同类型的点,我们需要绘制出来并进行标注对比,这时候采用plt.scatter()函数更方便。

  • 效果

  • 代码

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.random.randn(100)
    y = np.random.randn(100)
    colors = np.random.rand(100) 
    
    plt.scatter(x,y,c = colors, alpha=0.4)
    plt.title('plt.scatter')
    plt.colorbar()
    
    plt.show()
  • Iris数据散点图
    Iris是机器学习分类问题中常用的数据,包含150个数据,共三类,每个数据包含4个属性。我们用散点图绘制这三类数据,看看它们的分布情况。

    效果

  • 代码
    from sklearn.datasets import load_iris
    iris = load_iris()
    features = iris.data.T  # 转置用于单独获取所有特征	plt.scatter(features[0],features[1],alpha=0.4,c=iris.target)
    plt.xlabel('花萼长度(cm)',fontproperties='SimHei',fontsize=15)
    plt.ylabel('花萼宽度(cm)',fontproperties='SimHei',fontsize=15)
    plt.title('Iris数据分布(按照花萼长宽)',fontproperties='SimHei',fontsize=20)
    plt.colorbar()
    plt.show()

6. 总结

本文简单地讲述了Matplotlib的使用,以及部分常用图的绘制,更多的内容在后期用到的时候会更新上来。