Matplotlib 绘制常见图形进行数据描述

学习目标

• 熟悉数据可视化中图表的各类元素

• 学会利用 Matplotlib 绘制常见图形进行数据描述

Matplotlib 是 Python 的一个 2D 图形库, 能够生成各式各样的图形。其界面具有可交互性, 同时 Matplotlib 库又能够跨平台,既可以在 Python 脚本中进行编码操作, 也能在 Jupyter Notebook 中使用, 在其他相关的编辑平台也都可以便捷地使用。如果使用的是 Jupyter Notebook 平台, 则相关图形库已在软件内直接配置,但是其生成的图形无法进行交互,而是单独内嵌于 Jupyter Notebook 的界面中。 掌握 Matplotlib 技能是必备的,Matplotlib 能将数据进行可视化,更直观地呈现,使数据更加美观,更有说服力。

安装

在第一次使用 pip3 安装 Matplotlib 之前,需要安装。

!pip install matplotlib

安装完成后使用下列语句来检测是否安装成功。

!python -m pip list

安装成功界面。

【例 1】 以一个简单的示例来感受下 Matplotlib 的魅力。

import matplotlib.pyplot as plt
plt.figure(figsize=(5,3))
plt.plot([1, 4, 6, 7], [1, 6, 4, 3])
plt.show()

基本图表元素

本节主要介绍 Matplotlib 基本图表绘制的元素, 在 Matplotlib 中, 整个图像为一个 Figure 对象。 在 Figure 对象中可以包含一个或者多个 Axes 对象。 每个 Axes 对象都是一 个拥有坐标系统的绘图区域。基本图表元素的关系如图所示。

坐标轴

坐标轴是数据可视化的一个重要布局,一个图形可以包含任意数量的轴,但通常至少有一个,每个轴都可以设置一个轴标签。常见的是二维坐标轴,即包含 X 轴(横轴)和 Y 轴(纵轴), 轴上可以设置刻度标签, 使得生成的图像可以体现具体的数据值和相对位置。

在使用 Matplotlib 模块画坐标图时, 往往需要对坐标轴设置很多参数, 这些参数包括横纵 坐标轴范围、坐标轴刻度大小、坐标轴名称等。 在 Matplotlib 中包含了很多函数, 用来对 这些参数进行设置,如表所示。

方法 说明
plt.xlim()、plt.ylim() 设置横纵坐标轴范围
plt.xlabel()、plt.ylabel() 设置坐标轴名称
plt.xticks()、plt.yticks()

设置坐标轴刻度

【例2】 坐标轴设置。

import numpy as np
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
myfont = fm.FontProperties('simhei') #设置字体
t = np.arange(0.0, 2.0*np.pi, 0.01)    # 自变量取值范围
s = np.sin(t)   # 计算正弦函数值
z = np.cos(t)   # 计算余弦函数值
plt.plot(t, s,color='red', label='正弦')
plt.plot(t, z,color='blue', label='余弦')
plt.xlim((0,10))
plt.ylim((-1,1))
plt.xlabel('x-变量', fontproperties=myfont, fontsize=18) # 设置x标签
plt.ylabel('y-函数值', fontproperties=myfont, fontsize=18)
plt.xticks( np.linspace(0,2.0*np.pi,5))
plt.yticks( np.linspace(-1,1,5))
plt.title('sin-cos函数图像', fontproperties='stliti', fontsize=24) # 标题
plt.legend(prop=myfont)   # 设置图例
plt.show()

 

图例

图例是可视化图像中帮助识别图线的重要元素, 尤其是图像中线型复杂、数量较多 时。 在 Matplotlib 中, 设置图例通常有两种方式:一种是添加 label 参数, 另一种是调用 ax.legend() 或者 plt.legend()。 其中, 在 plt.legend() 中可以通过传入 loc 参数, 来调整图例的位置,具体的 loc 参数位置对应如表所示。

loc参数 对应数字
best 0
upper right 1
upper left 2
lower left 3
lower right 4
right 5
center left 6
center right 7
lower center 8
upper center 9
center 10

【例 3】 增加图例:在例2的基础上增加描述图线类型的图例。

import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0*np.pi, 0.01)    # 自变量取值范围
s = np.sin(t)   # 计算正弦函数值
z = np.cos(t)   # 计算余弦函数值
plt.plot(t, s)
plt.plot(t, z)

plt.legend(prop={'family':'simhei','size':15},
           loc='upper right',
           labels=[' 正弦 ',' 余弦 '])
plt.show()

标注

在图形上给数据添加文本注解能够帮助阅读者快速理解图像和定位数据,方便我们在 合适的位置添加描述信息。annotate() 支持带箭头的划线工具, 而 text() 是一种无指向型注释。调用语句和参数说明如表所示。

【例 4】 增加标注。

import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-4,4,20)
y=0.5*x+2
plt.figure(figsize=(6,6))
plt.plot(x,y)
x0=0
y0=0.5*x0+2
plt.scatter(x0,y0,s=50,color='r')
plt.annotate(s=r'$0.5*x+2=%s$'%y0,
             xy=(x0,y0),
             xytext=(+1,1),
             fontsize=16,
             arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=.2'))
x0=-2
y0=0.5*x0+2
plt.scatter(x0,y0,s=50,color='r')
plt.text(x0,
         y0-0.2,
         s='三个参数 : $x,y,t$',
#         fontdict={'size':'14','color':'red'},
         fontsize='14',
         color='red',
         family='simhei')
plt.show()

图表的保存

完成图表的绘制以后, 可以让程序自动将图表保存到文件中。 可将plt.show() 的调用替换为 plt.savefig() 的调用。

plt.savefig('figure_plot.png',bbox_inches='tight')

其中,第一个参数指定要以什么样的文件名保存图表,这个文件将存储到执行程序所 在的目录中。第二个参数指定将图表多余的空白区域裁减掉。 Python中Matplotlib Savefig()不同参数的使用_wilbeok的博客-CSDN博客_matplotlib savefig

常见图形绘制

尽管 matplotlib 可以绘制的图像种类丰富, 细节风格处理也可以在各个参数中更改实现,但在实际的数据可视化处理中,使用频率较高的还是较为简单的几种图表。

散点图

散点图经常用来显示分布或者比较几个变量的相关性或者分组。绘制散点图的关键是 scatter() 函数。

plt.scatter(x, y, s, c, marker)

其中,x、y表示坐标点的位置,s代表点的大小/粗细标量,c表示点的颜色,marker是标记的样式,默认是 'o'。

【例 5】 散点图示例。

import matplotlib.pylab as pl
import numpy as np
x = np.random.random(100)
y = np.random.random(100)
pl.scatter(x,y,s=x*500,c=u'r',marker=u'*')
# s指大小,c指颜色,marker指符号形状
pl.show()

折线图

在 matplotlib 面向对象的绘图库中,pyplot 是一个方便常用的接口。在绘制折线图时, plot() 函数既能够创建单条折线的折线图,也可以支持多条折线的复合图。 调用方法也很简单,只要在 plot() 函数中传入对应的 X 轴和 Y 轴数据即可。

plt.plot(x, y, color, linewidth, linestyle)

其中,x、y 是对应的坐标数据,color 用来指定折线的颜色,linewidth 指定折线的宽度, linestyle 指定折线的样式。

【例6】 折线图示例。

import matplotlib.pyplot as plt
import numpy as np
import math
import datetime
recordings = [datetime.date(2020,9,1),datetime.date(2020,9,2),
              datetime.date(2020,9,3), datetime.date(2020,9,4),
              datetime.date(2020,9,5),datetime.date(2020,9,6)]
words = [13,17,14,25,15,12]
plt.plot(recordings,words)
plt.show()

柱状图

柱状图常用于二维数据集,并且只需要比较一个维度。普通柱状图可以反映一组数据 内部时间变化或者事物变化的某项指标的差异。复合型的多组柱状图能够比较多组数据集 各项间的变化。柱状图本身可以利用柱状之间的不同高度来反映数据的差异,但不适用于 规模较大的数据集。在 matplotlib 中使用 bar() 函数来绘制柱状图。

matplotlib.pyplot.bar(left, height, alpha, width, color, edgecolor, label, lw)

其中,left 表示 X 轴的位置序列, 一般采用 range 函数产生一个序列, 也可以是字符 串;height 表示 Y 轴的数值序列, 即柱形图的高度;alpha 度量的是透明度, 一般值越小 越透明;width 描述了柱状图的宽度,一般为 0.8 ;color 或 facecolor 代表柱形图填充的颜 色;edgecolor 用来设置图形边缘颜色;label 是解释每个柱子代表的含义, 即 bar 的标签; linewidth 或 lw 用于调整边缘线的宽。

【例7】 柱状图示例。

import matplotlib.pyplot as plt
x = [ '2016', '2017', '2018', '2019','2020']
y1 = [4500, 5200, 5000, 7000, 3000]
plt.bar(x=x, height=y1, label='房地产行业', color='steelblue', alpha=0.8)

for x1, yy in zip(x, y1):
    plt.text(x1, yy + 1, str(yy), ha='center', va='bottom', fontsize=10, rotation=10)

import matplotlib.pyplot as plt
x = [ '2016', '2017', '2018', '2019','2020']
y1 = [4500, 5200, 5000, 7000, 3000]
y2 = [3000, 2000, 3400, 3000, 1000]
plt.bar(x=x, height=y1, label='房地产行业', color='steelblue', alpha=0.8)
plt.bar(x=x, height=y2, label='金融业', color='indianred', alpha=0.8)
for x1, yy in zip(x, y1):
    plt.text(x1, yy + 1, str(yy), ha='center', va='bottom', fontsize=10, rotation=0)
for x1, yy in zip(x, y2):
   plt.text(x1, yy + 1, str(yy), ha='center', va='bottom', fontsize=10, rotation=0)
plt.title("房地产行业与金融业新增公司数目对比",fontproperties='simhei');

绘制饼状图

import numpy as np
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
colors = ['yellowgreen', 'gold', '#FF0000', 'lightcoral']
#explode = (0, 0.1, 0, 0.1)              # 使饼状图中第2片和第4片裂开
plt.figure(figsize=(15,8))
plt.pie(np.random.random(4),labels=labels, colors=colors,
       autopct='%1.1f%%', shadow=True, startangle=90,
       radius=0.25, center=(0, 0))   # autopct设置饼内百分比的格式

plt.show()

import numpy as np
import matplotlib.pyplot as plt
#The slices will be ordered and plotted counter-clockwise.
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
colors = ['yellowgreen', 'gold', '#FF0000', 'lightcoral']
explode = (0, 0.1, 0, 0.1)              # 使饼状图中第2片和第4片裂开
fig = plt.figure()
ax = fig.gca()
ax.pie(np.random.random(4), explode=explode, labels=labels, colors=colors,
       autopct='%1.1f%%', shadow=True, startangle=90,
       radius=0.25, center=(0, 0), frame=True)   # autopct设置饼内百分比的格式
ax.pie(np.random.random(4), explode=explode, labels=labels, colors=colors,
       autopct='%1.1f%%', shadow=True, startangle=45,
       radius=0.25, center=(1, 1), frame=True)
ax.pie(np.random.random(4), explode=explode, labels=labels, colors=colors,
       autopct='%1.1f%%', shadow=True, startangle=90,
       radius=0.25, center=(0, 1), frame=True)
ax.pie(np.random.random(4), explode=explode, labels=labels, colors=colors,
       autopct='%1.2f%%', shadow=False, startangle=135,
       radius=0.35, center=(1, 0), frame=True)
ax.set_xticks([0, 1])                    # 设置坐标轴刻度
ax.set_yticks([0, 1])
ax.set_xticklabels(["Sunny", "Cloudy"])  # 设置坐标轴刻度上的标签
ax.set_yticklabels(["Dry", "Rainy"])
ax.set_xlim((-0.5, 1.5))                 # 设置坐标轴跨度
ax.set_ylim((-0.5, 1.5))
ax.set_aspect('equal')                   # 设置纵横比相等
plt.show()

使用pyplot绘制,多个图形在一起显示

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 500)
y = np.sin(x)
z = np.cos(x*x)
plt.figure(figsize=(8,4))
# 标签前后加$将使用内嵌的LaTex引擎将其显示为公式
plt.plot(x,y,label='$sin(x)$',color='red',linewidth=2)   # 红色,2个像素宽
plt.plot(x,z,'b--',label='$cos(x^2)$')                            # 蓝色,虚线
plt.xlabel('Time(s)')
plt.ylabel('Volt')
plt.title('Sin and Cos figure using pyplot')
plt.ylim(-1.2,1.2)
plt.legend()                                                                 # 显示图例
plt.show()                                                                   # 显示绘图窗口

subplot 子图

在实际操作中,我们常常希望在一张图片中显示多个小图表进行对比,这样的操作在 matplotlib 中称为子图,可以使用 subplot() 函数来绘制子图。

plt.subplot(numbRow,numbCol,plotNum)

其中,numbRow 表示 plot 图的行数,numbCol 是 plot 图的列数,plotNum 指的是 numbRownumbCol 的矩阵中的第几幅图。 例如, 如果是 subplot(2,2,3), 则该图像中包含 4 个子图, 构成 22 的矩阵图阵,3 则表示的是第 3 幅图。 如果是单数个子图, 那么最后一幅图占据的空间可能较大, 可以根据实际布局修改行数或者列数。 注意,subplot 函数中几个参数之间可以不用逗号连接,直接写成 subplot(223)。

【例 9】 不均匀子图示例。

import numpy as np
import matplotlib.pyplot as plt
x= np.linspace(0, 2*np.pi, 500)            # 创建自变量数组
y1 = np.sin(x)                             # 创建函数值数组
y2 = np.cos(x)
y3 = np.sin(x*x)
plt.figure(1)                              # 创建图形
ax1 = plt.subplot(2,2,1)                   # 第一行第一列图形
ax2 = plt.subplot(2,2,2)                   # 第一行第二列图形
ax3 = plt.subplot(212, facecolor='y')      # 第二行
plt.sca(ax1)                               # 选择ax1
plt.plot(x,y1,color='red')                 # 绘制红色曲线
plt.ylim(-1.2,1.2)                         # 限制y坐标轴范围
plt.sca(ax2)                               # 选择ax2
plt.plot(x,y2,'b--')                       # 绘制蓝色曲线
plt.ylim(-1.2,1.2)
plt.sca(ax3)                               # 选择ax3
plt.plot(x,y3,'g--')
plt.ylim(-1.2,1.2)
plt.show()

上一篇:Matplotlib库入门


下一篇:Matplotlib进行数据可视化的快速上手指南