一、图表的基本组成
数据分析图表有很多种,但每一种图表的绝大组成部分是基本相同的,一张完整的图表一般包括:画布、图表标题、绘图区、数据系列、坐标轴、坐标轴标题、图例、文本标签、网格线等,如图所示。

图 图表的基本组成部分
下面将详细介绍各个组成部分的功能:
■ 画布:图中最大的白色区域,作为其他图表元素的容器。
■ 图表标题:用来概况图表内容的文字,常用的功能有设置字体、字号及字体颜色等。
■ 绘图区:画布中的一部分,即显示图形的矩形区域,可改变填充颜色、位置,以便为图表展示更好的图形效果。
■ 数据系列:在数据区域中,同一列(或同一行)数值数据的集合构成一组数据系列,也就是图表中相关数据点的集合。图表中可以有一组到多组的数据系列,多组数据系列之间通常采用不同的图案、颜色或符号来区分。图中,销售额就是数据系列。
■ 坐标轴及坐标轴标题:坐标轴是标识数值大小及分类的垂直组和水平线,上面有标定数据值的标志(刻度)。一般情况下,水平轴(x轴)表示数据的分类;坐标轴标题用来说明坐标轴的分类及内容,分为水平坐标轴和垂直坐标轴。图中x轴的标题是“年份”,y轴的标题是“线上销售额(元)”。
■ 图例:是指示图表中系列区域的符号、颜色或形状定义数据系列所代表的内容。图例由两部分构成——图例标识:代表数据系列的图案,即不同颜色的小方块;图例项:与图例标识对应的数据系列名称,一种图例标识只能对应一种图例项。
■ 文本标签:用于为数据系列添加说明文字。
■ 网格线:贯穿绘图区的线条,类似标尺可以衡量数据系列数值的标准。常用的功能有设置网格线宽度、样式、颜色、坐标轴等。
二、Matplotlib概述
众所周知,Python中有很多绘图库,各有特点,而Matplotlib则是最基础的Python可视化库。学习Python数据可视化,应首先从Matplotlib学起,然后再学习其他的库作为拓展。
2.1 Matplotlib简介
Matplotlib是一个Python 2D绘图库,常用于数据可视化。它能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形。
Matplotlib非常强大,绘制各种各样的图表都游刃有余,它可以将事情变得更容易,也将困难的事情变得可能。它只需几行代码就可以绘制各种折线图 、柱形图、直方图 、饼形图 、散点图 等。

图 折线图

图 多折线图

图 柱形图

图 直方图

图 饼形图

图 散点图
Matpoltlib不仅可以绘制以上最基础的图表,还可以绘制一些高级图表,例如,双y轴可视化数据分析图表 、堆叠柱形图 、渐变饼形图 、等高线柱形图 。

图 双y轴可视化数据分析图表

图 堆叠柱形图

图 渐变饼形图

图 等高线柱形图
不仅如此,Matplotlib还可以绘制3D图表。例如,三维柱形图(图)、三维曲面图(图)。

图 三维柱形图

图 三维曲面图
综上所述,只要熟练地掌握Matplotlib的函数以及各项参数,就能够绘制出各种精彩、美观的图表,达到数据分析的需求。
2.2 安装Matplotlib
下面介绍如何安装Matplotlib,安装方法有以下两种:
(1) 通过pip工具安装
在系统搜索框中输入cmd,单击“命令提示符”,打开“命令提示符”窗口,在命令提示符后输入安装命令。通过pip工具进行安装,安装命令如下:
pip install matplotlib
(2)通过Pycharm开发环境安装
运行Pycharm,选择File→Settings菜单项,打开“Settings”窗口,选择“Project Interpreter”选项,然后单击添加(+)按钮,如图 所示。

图 Settings窗口
单击添加(+)按钮,打开“Available Packages”窗口,在搜索文本框中输入需要添加的模块名称,例如“matplotlib”,然后在列表中选择需要安装的模块,如图所示,单击“Install Package”按钮,即可实现Matplotlib模块的安装。

图 在Pycharm开发环境中安装Matplotlib模块
2.3 Matplotlib图表之初体验
创建Matplotlib图表只需简单的1、2、3步。下面将绘制第一张图表。
快速示例01 绘制第一张图表
(1)引入pyplot模块。
(2)使用Matplotlib模块的plot方法绘制图表。
(3)运行程序,结果如图 所示。

图 绘制第一张图表

图 绘制简单散点图
程序代码如下:
01 import matplotlib.pyplot as plt
02 plt.plot([1, 2, 3, 4,5])
03 plt.show()
快速示例02 绘制散点图
对上述代码稍作改动便可绘制出散点图,程序代码如下:
01 import matplotlib.pyplot as plt
02 plt.plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro')
03 plt.show()
运行程序,结果如图所示。
三、 图表的常用设置
本节主要介绍图表的常用设置,主要包括颜色设置、线条样式、标记样式、设置画布、坐标轴、添加文本标签、设置标题和图例、添加注释文本、调整图表与画布边缘间距以及其他设置等。
3.1 基本绘图plot函数
Matplotlib基本绘图主要使用plot函数,语法如下:
matplotlib.pyplot.plot(x,y,format_string,**kwargs)
参数说明:
■ x:x轴数据。
■ y:y轴数据。
■ format_string:控制曲线格式的字符串,包括颜色、线条样式和标记样式。
■ **kwargs:键值参数,相当于一个字典,比如,输入参数为:
(1,2,3,4,k,a=1,b=2,c=3),*args=(1,2,3,4,k),**kwargs={'a':'1,'b':2,'c':3}。
快速示例03 绘制简单的折线图
绘制简单的折线图,程序代码如下:
01 import matplotlib.pyplot as plt
02 #折线图
03 #使用range函数创建整数列表
04 x=range(1,15,1)
05 y=range(1,42,3)
06 plt.plot(x,y)
07 plt.show()
运行程序,输出结果如图 所示。

图 绘制简单折线图
快速示例04 绘制体温折线图
在上述举例中的数据是通过range函数随机创建的。下面导入Excel体温表的数据,分析14天的基础体温情况,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 df=pd.read_excel('体温.xls') #导入Excel文件
04 #折线图
05 x =df['日期'] #x轴数据
06 y=df['体温'] #y轴数据
07 plt.plot(x,y)
08 plt.show()
运行程序,输出结果如图 所示。

图 体温折线图
至此,您可能还是觉得上面的图表不够完美,那么在接下来的学习中,我们将一步一步完善这个图表。下面将介绍图表中的线条颜色、线条样式和标记样式的相关设置。
颜色设置
color参数可以设置线条颜色,通用的颜色值如表所示。
表 通用颜色值及说明

其他颜色可以通过十六进制字符串指定,或者通过颜色名称指定,例如:
■ 浮点形式的RGB或RGBA元组,例如:(0.1, 0.2, 0.5)或(0.1, 0.2, 0.5, 0.3)。
■ 十六进制的RGB或RGBA字符串,例如:#0F0F0F或#0F0F0F0F。
■ 0~1之间的小数作为的灰度值,例如:0.5。
■ {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}其中的一个颜色值。
■ X11/CSS4规定中的颜色名称。
■ Xkcd中指定的颜色名称,例如:'xkcd:sky blue'。
■ Tableau调色板中的颜色 {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink','tab:gray', 'tab:olive', 'tab:cyan'}。
■ “CN”格式的颜色循环,对应的颜色设置代码如下:
01 from cycler import cycler
02 colors=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b','#e377c2','#7f7f7f', '#bcbd22', '#17becf']
03 plt.rcParams['axes.prop_cycle'] = cycler(color=colors)
线条样式
linestyle:可选参数,可以设置线条的样式,设置值如下:
■ “-”:实线,默认值。
■ “--”:双划线
■ “-.”:点划线。
■ “:”:虚线。
设置后的效果如图 所示。

图 线条样式
标记样式
marker:可选参数,可以设置标记样式,设置值如表所示。
表 标记设置及说明

下面为“14的天基础体温曲线图”设置颜色和样式,并在实际体温位置进行标记,关键代码如下:
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
运行程序,输出结果如图 所示。

图 带标记的折线图
3.2 设置画布
画布就像我们画画的画板一样,在Matplotlib中可以使用figure方法设置画布大小、分辨率、颜色和边框等,语法如下:
matpoltlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
参数说明:
■ num:图像编号或名称,数字为编号;字符串为名称,可以通过该参数激活不同的画布。
■ figsize:指定画布的宽和高,单位为英寸。
■ dpi:指定绘图对象的分辨率,即每英寸包含多少个像素,默认值为80。像素越大,画布越大。
■ facecolor:背景颜色。
■ edgecolor:边框颜色。
■ frameon:是否显示边框。默认值为True,绘制边框;如果为False,则不绘制边框。
快速示例05 自定义一个黄色画布
自定义一个5×3的黄色画布,关键代码如
画布就像我们画画的画板一样,在Matplotlib中可以使用figure方法设置画布大小、分辨率、颜色和边框等,语法如下:
matpoltlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
参数说明:
■ num:图像编号或名称,数字为编号;字符串为名称,可以通过该参数激活不同的画布。
■ figsize:指定画布的宽和高,单位为英寸。
■ dpi:指定绘图对象的分辨率,即每英寸包含多少个像素,默认值为80。像素越大,画布越大。
■ facecolor:背景颜色。
■ edgecolor:边框颜色。
■ frameon:是否显示边框。默认值为True,绘制边框;如果为False,则不绘制边框。
快速示例05 自定义一个黄色画布
自定义一个5×3的黄色画布,关键代码如下:
01 import matplotlib.pyplot as plt
02 fig=plt.figure(figsize=(5,3),facecolor='yellow')
运行程序,输出结果如图所示。

图 设置黄色画布
注意:'figsize=(5,3)',实际画布大小是500×300,所以,这里不要输入太大的数字。
3.3 设置坐标轴
一张精确的图表,其中不免要用到坐标轴,下面介绍关于Matplotlib中坐标轴的使用方法。
x轴、y轴标题
设置x轴和y轴标题主要使用xlabel函数和ylabel函数。
快速示例06 为体温折线图设置坐标轴标题
设置x轴标题为“2020年2月”,y轴标题为“基础体温”,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题
04 df=pd.read_excel('体温.xls') #导入Excel文件
05 #折线图
06 x=df['日期'] #x轴数据
07 y=df['体温'] #y轴数据
08 plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
09 plt.xlabel('2020年2月') #x轴标题
10 plt.ylabel('基础体温') #y轴标题
11 plt.show()
运行程序,输出结果如图 所示。

图 为体温折线图设置坐标轴标题
技巧:上述举例,应注意如下两个问题,因为在实际编程过程中它们经常出现。
(1)中文乱码的问题。
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
(2)负号不显示的问题。
plt.rcParams['axes.unicode_minus'] = False #解决负号不显示
坐标轴刻度
用matplotlib画二维图像时,默认情况下的横坐标(x轴)和纵坐标(y轴)显示的值有时可能达不到我们的需求,需要借助xticks函数和yticks函数分别对x轴和y轴的值进行设置。
xticks函数的语法如下:
xticks(locs, [labels], **kwargs)
参数说明:
■ locs:数组,表示x轴上的刻度。例如,在“学生英语成绩分布图”中,x轴的刻度是2~14之间的偶数,如果想改变这个值,就可以通过locs参数设置。
■ labels:也是数组,默认值和locs相同。locs表示位置,而labels则决定该位置上的标签,如果赋予了labels空值,则x轴将只有刻度而不会显示任何值。
快速示例07 为折线图设置刻度(1)
在“14天基础体温折线图”中,x轴是从2~14之间的偶数,但实际日期是从1~14的连续数字,下面使用xticks函数来解决这个问题,将x轴的刻度设置为1~14的连续数字,程序效果如图5.27所示,关键代码如下:
plt.xticks(range(1,15,1))
快速示例08 为折线图设置刻度(2)
上述举例中的日期格式看起来不是很直观,下面将x轴刻度标签直接改为“日”,关键代码如下:
01 dates=['1日','2日','3日','4日','5日',
02 '6日','7日','8日','9日','10日',
03 '11日','12日','13日','14日']
04 plt.xticks(range(1,15,1),dates)
运行程序,对比效果如图 所示。

图 更改x轴刻度

图 设置x轴刻度为“日”
接下来,设置y轴刻度,主要使用yticks函数。例如,设置体温从35.4~38度,关键代码如下:
plt.yticks([35.4,35.6,35.8,36,36.2,36.4,36.6,36.8,37,37.2,37.4,37.6,37.8,38])
坐标轴范围
坐标轴范围是指x轴和y轴的取值范围。设置坐标轴范围主要使用xlim函数和ylim函数。
快速示例09 为折线图设置坐标轴范围
设置x轴(日期)范围为1~14,y轴(基础体温)范围为35~45,关键代码如下:
01 plt.xlim(1,14)
02 plt.ylim(35,45)
运行程序,输出结果如图 所示。

图 为折线图坐标轴范围
网格线
细节决定成败,很多时候为了图表的美观,不得不考虑细节。下面介绍图表细节之一——网格线,主要使用grid函数,首先生成网格线,代码如下。
plt.grid()
grid函数也有很多参数,如颜色、网格线的方向(参数axis=’x’隐藏x轴网格线,axis=’y’隐藏y轴网格线)、网格线样式和网格线宽度等,下面为图表设置网格线,关键代码如下:
plt.grid(color='0.5',linestyle='--',linewidth=1)
运行程序,输出结果如图 所示。

图 带网格线的折线图
技巧:网格线对于饼形图来说,直接使用时并不会显示,需要与饼形图的frame参数配合使用,设置该参数值为True。
3.4 添加文本标签
绘图过程中,为了能够更清晰、直观地看到数据,有时需要给图表中指定的数据点添加文本标签。下面介绍细节之二——文本标签,主要使用text函数,语法如下:
matplotlib.pyplot.text(x, y, s, fontdict=None, withdash=False, **kwargs)
参数说明:
■ x:x坐标轴的值。
■ y:y坐标轴的值。
■ s:字符串,注释内容。
■ fontdict:字典,可选参数,默认值为None。用于重写默认文本属性。
■ withdash:布尔型,默认值为False,创建一个TexWithDash实例,而不是Text实例。
■ **kwargs:关键字参数。这里指通用的绘图参数,如字体大小fontsize=12、垂直对齐方式horizontalalignment=’center’(或简写为ha=’center’)、水平对齐方式verticalalignment=’center’(或简写为va=’center’)。
快速示例10 为折线图添加“基础体温”文本标签
为图表中的各个数据点添加文本标签,关键代码如下。
01 for a,b in zip(x,y):
02 plt.text(a,b+3,'%.1f'%b,ha = 'center',va = 'bottom',fontsize=9)
运行程序,输出结果如图 所示。

图 带文本标签的折线图
上述代码,首先,x、y是x轴和y轴的值,它代表了折线图在坐标中的位置,通过for循环找到每一个x、y值相对应的坐标赋值给a、b,再使用plt.text参数在对应的数据点上添加文本标签,而for循环也保证了折线图中的每一个数据点都有文本标签。其中,'a,b+3'表示每一个数据点(x值对应y值加3)的位置处添加文本标签,'%.1f’%b'是对y值进行的格式化处理,保留小数点1位;'ha=‘center’、va=‘bottom’'代表水平对齐、垂直对齐的方式,fontsize则是字体大小。
3.5 设置标题和图例
数据是一个图表所要展示的东西,而有了标题和图例则更加帮助我们理解这个图表的含义和想要传递的信息。下面介绍图表细节之三——标题和图例。
图表标题
为图表设置标题主要使用title函数,语法如下:
matplotlib.pyplot.title(label, fontdict=None, loc='center', pad=None, **kwargs)
参数说明:
■ label:字符串,图表标题文本。
■ fontdict:字典,用来设置标题字体的样式。如'{'fontsize': 20,'fontweight':20,'va': 'bottom','ha': 'center'}'。
■ loc:字符串,标题水平位置,参数值为center、left或right,分别表示水平居中、水平居左和水平居右,默认为水平居中。
■ pad:浮点型,表示标题离图表顶部的距离,默认为None。
■ **kwargs:关键字参数,可以设置一些其他文本属性。
例如,设置图表标题为“14天基础体温曲线图”,主要代码如下:
plt.title('14天基础体温曲线图',fontsize='18')
图表图例
为图表设置图例主要使用legend函数,下面介绍图例相关的设置。
(1)自动显示图例
plt.legend()
(2)手动添加图例
plt.legend('基础体温')
注意:这里需要注意一个问题,当手动添加图例时,有时会出现文本显示不全,解决方法是在文本后面加一个逗号“,”,主要代码如下:
plt.legend(('基础体温',))
(3)设置图例显示位置
通过loc参数可以设置图例的显示位置,如在左下方显示,主要代码如下:
plt.legend(('基础体温',),loc='upper right',fontsize=10)
具体图例显示位置的设置如表所示。
表 图例位置参数设置值及描述

上述参数可以设置大概的图例位置,如果这样可以满足需求,那么第二个参数不进行设置也可以。第二个参数bbox_to_anchor是元组类型,包括两个值:num1用于控制legend的左右移动,值越大越向右边移动;num2用于控制legend的上下移动,值越大,越向上移动。用于微调图例的位置。
另外,通过该参数还可以设置图例位于图表的外面,关键代码如下:
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)
下面来看下设置标题和图例后的“14天基础体温曲线图”,效果如图 所示。

图 14天基础体温曲线图
3.6 添加注释
annotate函数用于在图表上给数据添加文本注释,而且支持带箭头的划线工具,方便我们在合适的位置添加描述信息。
快速示例11 为图表添加注释
在“14天基础体温曲线图”中用箭头指示最高体温,效果如图 所示。

图 设置箭头指示最高体温
关键代码如下:
01 plt.annotate('最高体温', xy=(9,37.1), xytext=(10.5,37.1),
02 xycoords='data',
03 arrowprops=dict(facecolor='r', shrink=0.05))
下面介绍一下上述举例中用到的几个主要参数:
■ xy:被注释的坐标点,二维元组,如(x,y)。
■ xytext:注释文本的坐标点(也就是上述举例中箭头的位置),也是二维元组,默认与xy相同。
■ xycoords:是被注释点的坐标系属性,图5.33 设置箭头指示最高体温
关键代码如下:
01 plt.annotate('最高体温', xy=(9,37.1), xytext=(10.5,37.1),
02 xycoords='data',
03 arrowprops=dict(facecolor='r', shrink=0.05))
下面介绍一下上述举例中用到的几个主要参数:
■ xy:被注释的坐标点,二维元组,如(x,y)。
■ xytext:注释文本的坐标点(也就是上述举例中箭头的位置),也是二维元组,默认与xy相同。
■ xycoords:是被注释点的坐标系属性,设置值如表所示。
表 xycoords参数设置值及说明

■ arrowprops:箭头的样式,dict(字典)型数据,如果该属性非空,则会在注释文本和被注释点之间画一个箭头。arrowprops参数设置值及说明如表所示。
表 arrowprops参数设置值及说明

说明:关于annotate函数的内容还有很多,这里不再赘述,感兴趣的读者可以以上述举例为基础,尝试更多的属性和样式。
3.7 调整图表与画布边缘间距
很多时候会发现绘制出的图表,由于x轴、y轴标题与画布边缘距离太近,而出现显示不全的情况,如图 所示。

图 显示不全的情况

图 调整间距示意图
这种情况可以使用subplots_adjust函数来调整,该函数主要用于调整图表与画布的间距,也可以调整子图表的间距。语法如下:
subplots_adjust(left=None, bottom=None,right=None, top=None,wspace=None,hspace=None)
参数说明:
■ left、bottom、right和top:这四个参数是用来调整上、下、左、右的空白,如图5.35所示,注意这里是从画布的左下角开始标记,取值为0~1。left和bottom则值越小,空白越少;而right和top则值越大,空白越少。
■ wspace和hspace:用于调整列间距和行间距。
举个简单的例子,调整图表上、下、左、右的空白,关键代码如下:
plt.subplots_adjust(left=0.2, right=0.9, top=0.9, bottom=0.2)
如果只显示图片,坐标轴及标题都不显示,可以使用如下代码:
plt.subplots_adjust(left=0, bottom=0, right=1, top=1,hspace=0.1,wspace=0.1)
3.8 其他设置
坐标轴的刻度线
(1)4个方向的坐标轴上的刻度线是否显示
plt.tick_params(bottom=False,left=True,right=True,top=True)
(2)x轴和y轴的刻度线显示方向
in表示向内;out向外;在中间就是inout,默认刻度线向外。
01 plt.rcParams['xtick.direction'] = 'in' #x轴的刻度线向内显示
02 plt.rcParams['ytick.direction'] = 'in' #y轴的刻度线向内显示
坐标轴相关属性设置
■ axis():返回当前axes范围。
■ axis(v):通过输入v = [xmin, xmax, ymin, ymax],设置x、y轴的取值范围。
■ axis('off '):关闭坐标轴的轴线及坐标轴标签。
■ axis('equal'):使x、y轴长度一致。
■ axis('scaled'):调整图框的尺寸(而不是改变坐标轴的取值范围),使x、y轴长度一致。
■ axis('tight'):改变x轴和y轴的限制,使所有数据被展示。如果所有的数据已经显示,它将移动到图形的中心而不修改(xmax - xmin)或(ymax - ymin)值。
■ axis('image'):缩放axis范围(limits),等同于对data缩放范围。
■ axis('auto'):自动缩放。
■ axis('normal'):不推荐使用。恢复默认状态,轴限的自动缩放使数据显示在图表中。
四、常用图表的绘制
本节将介绍常用图表的绘制,主要包括绘制折线图、绘制柱形图、绘制直方图、绘制饼形图、绘制散点图、绘制面积图、绘制热力图、绘制箱形图、绘制3D图表、绘制多个子图表以及图表的保存。对于常用的图表类型将以绘制多种类型图表进行举例,以适应不同应用场景的需求。
4.1 绘制折线图
折线图可以显示随时间而变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势。如基础体温曲线图、学生成绩走势图、股票月成交量走势图、月销售统计分析图、微博、公众号、网站访问量统计图等,都可以用折线图体现。在折线图中,类别数据沿水平轴均匀分布,所有值的数据沿垂直轴均匀分布。
Matplotlib绘制折线图主要使用plot函数,相信通过前面的学习,您已经了解了plot函数的基本用法,并能够绘制一些简单的折线图,下面尝试绘制多折线图。
快速示例12 绘制学生的语、数、外的各科成绩分析图
使用plot函数绘制多折线图。例如,绘制学生的语、数、外的各科成绩分析图,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 df1=pd.read_excel('data.xls') #导入Excel文件
04 #多折线图
05 x1=df1['姓名']
06 y1=df1['语文']
07 y2=df1['数学']
08 y3=df1['英语']
09 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
10 plt.rcParams['xtick.direction'] = 'out' #x轴的刻度线向外显示
11 plt.rcParams['ytick.direction'] = 'in' #y轴的刻度线向内显示
12 plt.title('语数外成绩大比拼',fontsize='18') #图表标题
13 plt.plot(x1,y1,label='语文',color='r',marker='p')
14 plt.plot(x1,y2,label='数学',color='g',marker='.',mfc='r',ms=8,alpha=0.7)
15 plt.plot(x1,y3,label='英语',color='b',linestyle='-.',marker='*')
16 plt.grid(axis='y') #显示网格关闭y轴
17 plt.ylabel('分数')
18 plt.yticks(range(50,150,10))
19 plt.legend(['语文','数学','英语']) \ #图例
20 plt.show()
运行程序,输出结果如图 所示。

图 多折线图
上述举例,用到了几个参数,下面分别进行说明:
■ mfc:标记的颜色。
■ ms:标记的大小。
■ mec:标记边框的颜色
■ alpha:透明度,设置该参数可以改变颜色的深浅。
4.2 绘制柱形图
柱形图,又称长条图、柱状图、条状图等,是一种以长方形的长度为变量的统计图表。柱形图用来比较两个或以上的数据(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。
Matplotlib绘制柱形图时主要使用bar函数,语法如下:
matplotlib.pyplot.bar(x,height,width,bottom=None,*,align='center',data=None,**kwargs)
参数说明:
■ x:x轴数据。
■ height:柱子的高度,也就是y轴数据。
■ width:浮点型,柱子的宽度,默认值为0.8,可以指定固定值。
■ bottom:标量或数组,可选参数,柱形图的y坐标,默认值为None。
■ *:星号本身不是参数。星号表示其后面图5.36 多折线图
上述举例,用到了几个参数,下面分别进行说明:
■ mfc:标记的颜色。
■ ms:标记的大小。
■ mec:标记边框的颜色
■ alpha:透明度,设置该参数可以改变颜色的深浅。
■ x:x轴数据。
■ height:柱子的高度,也就是y轴数据。
■ width:浮点型,柱子的宽度,默认值为0.8,可以指定固定值。
■ bottom:标量或数组,可选参数,柱形图的y坐标,默认值为None。
■ *:星号本身不是参数。星号表示其后面的参数为命名关键字参数,命名关键字参数必须传入参数名,否则程序会出现错误。
■ align:对齐方式,如center(居中)和edge(边缘),默认值为center。
■ data:data关键字参数。如果给定一个数据参数,所有位置和关键字参数将被替换。
■ **kwargs:关键字参数,其他可选参数,如color(颜色)、alpha(透明度)、label(每个柱子显示的标签)等。
快速示例13 使用5行代码绘制简单的柱形图
使用5行代码绘制简单的柱形图,程序代码如下:
01 import matplotlib.pyplot as plt
02 x=[1,2,3,4,5,6]
03 height=[10,20,30,40,50,60]
04 plt.bar(x,height)
05 plt.show()
运行程序,输出结果如图 所示。

图 绘制简单的柱形图
bar函数可以绘制出各种类型的柱形图,如基本柱形图、多柱形图、堆叠柱形图等,只要将bar函数的主要参数理解透彻,就会达到意想不到的效果,下面介绍几种常见的柱形图。
基本柱形图
快速示例14 绘制2013~2019年线上图书销售额分析图
使用bar函数绘制“2013~2019年线上图书销售额分析图”,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 df = pd.read_excel('books.xlsx')
04 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
05 x=df['年份']
06 height=df['销售额']
07 plt.grid(axis="y", which="major") #生成虚线网格
08 #x、y轴标签
09 plt.xlabel('年份')
10 plt.ylabel('线上销售额(元)')
11 #图表标题
12 plt.title('2013-2019年线上图书销售额分析图')
13 plt.bar(x,height,width = 0.5,align='center',color = 'b',alpha=0.5)
14 #设置每个柱子的文本标签,‘format(b,',')’格式化销售额为千位分隔符格式
15 for a,b in zip(x,height):
16 plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=9,color = 'b',alpha=0.9)
17 plt.legend(['销售额']) #图例
18 plt.show()
运行程序,输出结果如图 所示。


图 绘制基本柱形图
上述举例,应用了前面所学习的知识。例如标题、图例、文本标签,坐标轴标签等。
多柱形图
快速示例15 绘制各平台的图书销售额分析图
对于线上图书销售额的统计,如果要统计各个平台的销售额,可以使用多柱形图,不同颜色的柱子代表不同的平台,如京东、天猫、自营等,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
04 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文图
4.3 绘制基本柱形图
上述举例,应用了前面所学习的知识。例如标题、图例、文本标签,坐标轴标签等。
多柱形图
快速示例15 绘制各平台的图书销售额分析图
对于线上图书销售额的统计,如果要统计各个平台的销售额,可以使用多柱形图,不同颜色的柱子代表不同的平台,如京东、天猫、自营等,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
04 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
05 x=df['年份']
06 y1=df['京东']
07 y2=df['天猫']
08 y3=df['自营']
09 width =0.25
10 #y轴标签
11 plt.ylabel('线上销售额(元)')
12 #图表标题
13 plt.title('2013-2019年线上图书销售额分析图')
14 plt.bar(x,y1,width = width,color = 'darkorange')
15 plt.bar(x+width,y2,width = width,color = 'deepskyblue')
16 plt.bar(x+2*width,y3,width = width,color = 'g')
17 #设置每个柱子的文本标签,‘format(b,',')’格式化销售额为千位分隔符格式
18 for a,b in zip(x,y1):
19 plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=8)
20 for a,b in zip(x,y2):
21 plt.text(a+width, b,format(b,','), ha='center', va= 'bottom',fontsize=8)
22 for a, b in zip(x, y3):
23 plt.text(a + 2*width, b, format(b, ','), ha='center', va='bottom', fontsize=8)
24 plt.legend(['京东','天猫','自营'])#图例
25 plt.show()
上述举例,在柱形图中若显示n个柱子,则柱子的宽度值需小于1/n,否则柱子会出现重叠现象。
运行程序,输出结果如图 所示。

图 绘制多柱形图
4.4 绘制直方图
直方图,又称质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型;纵轴表示分布情况。直方图是数值数据分布的精确图形表示,是一个连续变量(定量变量)的概率分布的估计。
绘制直方图主要使用hist函数,语法如下:
matplotlib.pyplot.hist(x,bins=None,range=None, density=None, bottom=None, histtype='bar', align='mid', log=False, color=None, label=None, stacked=False, normed=None)
参数说明:
■ x:数据集,最终的直方图将对数据集进行统计。
■ bins:统计数据的区间分布。
■ range:元组类型,显示的区间。
■ density:布尔型,显示频率统计结果,默认值为None。设置值为False不显示频率统计结果;设置值为True则显示频率统计结果。频率统计结果=区间数目/(总数×区间宽度)。
■ histtype:可选参数,设置值为bar、barstacked、step或stepfilled,默认值为bar,推荐使用默认配置,step使用的是梯状,stepfilled则会对梯状内部进行填充,效果与bar参数类似。
■ align:可选参数,值为left、mid或right,默认值为mid,控制柱状图的水平分布,left或者right,会有部分的空白区域,推荐使用默认值。
■ log:布尔型,默认值为False,即y坐标轴是否选择指数刻度。
■ stacked:布尔型,默认为False,是否为堆积状图。
快速示例16 绘制简单的直方图
绘制简单直的方图,程序代码如下:
01import matplotlib.pyplot as plt
02x=[22,87,5,43,56,73,55,54,11,20,51,5,79,31,27]
03plt.hist(x, bins = [0,25,50,75,100])
04plt.show()
运行程序,输出结果如图 所示。

图 简单的直方图
快速示例17 使用直方图分析学生数学成绩的分布情况
再举一个例子,通过直方图分析学生数学成绩的分布情况,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 df = pd.read_excel('grade1.xls')
04 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
05 x=df['得分']
06 plt.xlabel('分数')
07 plt.ylabel('学生数量')
08 # 显示图标题
09 plt.title("高一数学成绩分布直方图")
10 plt.hist(x, bins = [0,25,50,75,100,125,150],facecolor="blue", edgecolor="black", alpha=0.7)
11 plt.show()
运行程序,输出结果如图 所示。

图 分析数学成绩分布的直方图
上述举例,通过直方图可以清晰地看到高一数学成绩的分布情况。基本呈现正态分布的情况,两边低中间高,且高分段学生缺失,说明试卷有难度。那么,通过直方图还可以分析以下内容:
(1)对学生的成绩进行比较
呈正态分布的测验便于选拔优秀学生,通过直方图一目了然。
(2)确定人数和分数线。
测验成绩符合正态分布可以帮助等级评定时,确定人数和估计分数段内的人数,确定录取分数线、各个学科的优生率等。
(3)测验试题难度。
4.4 绘制饼形图
饼形图常用来显示各个部分在整体所占的比例。例如,在工作中如果遇到需要计算总费用或金额的各个部分构成比例的情况,一般通过各个部分与总额相除来计算,但是这种比例表示方法很抽象,而通过饼形图将直接显示各个组成部分所占比例,一目了然。
Matplotlib绘制饼形图主要使用pie函数,语法如下:
matplotlib.pyplot.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)进行归一化。
■ labels:每一块饼形图外侧显示的说明文字。
■ explode:每一块饼形图离中心的距离。
■ startangle:起始绘制角度,默认是从x轴正方向逆时针画起,如设置值为90,则从y轴正方向画起。
■ shadow:在饼形图下面画一个阴影,默认值为False,即不画阴影。
■ labeldistance:标记的绘制位置,相对于半径的比例,默认值为1.1,如<1,则绘制在饼图内侧。
■ autopct:设置饼图百分比,可以使用格式化字符串或format函数。如’%1.1f’保留小数点的后1位。
■ pctdistance:类似于labeldistance参数,指定百分比的位置刻度,默认值为0.6。
■ radius:饼图半径,默认值为1。
■ counterclock:指定指针方向,布尔型,可选参数,默认值为True,表示逆时针;如果值为False,则表示顺时针。
■ wedgeprops:字典类型,可选参数,默认值为None。字典传递给wedge对象用来画一个饼图。例如wedgeprops={'linewidth':2}设置wedge线宽为2。
■ textprops:设置标签和比例文字的格式,字典类型,可选参数,默认值为None。传递给text对象的字典参数。
■ center:浮点类型的列表,可选参数,默认值为(0,0),表示图表中心位置。
■ frame:布尔型,可选参数,默认值为False,不显示轴框架(也就是网格);如果值为True,则显示轴框架,与grid函数配合使用。在实际应用中建议使用默认设置,因为显示轴框架会干扰饼形图效果。
■ rotatelabels:布尔型,可选参数,默认值为False;如果值为True,则旋转到每个标签到指定的角度。
快速示例18 绘制简单的饼形图
绘制简单的饼形图,程序代码如下:
01 import matplotlib.pyplot as plt
02 x = [2,5,12,70,2,9]
03 plt.pie(x,autopct='%1.1f%%')
04 plt.show()
运行程序,输出结果如图 所示。

图 绘制简单的饼形图
饼形图也存在各种类型,主要包括基础饼形图、分裂饼形图、立体感带阴影的饼形图、环形图等。下面分别进行介绍。
基础饼形图
快速示例19 绘制饼形图分析各省销量的占比情况
下面通过饼形图分析2020年1月各省销量的占比情况,程序代码如下:
01 import pandas as pd
02 from matplotlib import pyplot as plt
03 df1 = pd.read_excel('data2.xls')
04 plt.rcParams['font.sans-serif']=['SimHei']\t#解决中文乱码
05 plt.figure(figsize=(5,3)) \t\t\t#设置画布大小
06 labels = df1['省']
07 sizes = df1['销量']
08 #设置饼形图每块的颜色
09 colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen', 'pink','gold']
10 plt.pie(sizes, #绘图数据
11 labels=labels, #添加区域水平标签
12 colors=colors, #设置饼图的自定义填充色
13 labeldistance=1.02, #设置各扇形标签(图例)与圆心的距离
14 autopct='%.1f%%', #设置百分比的格式,这里保留一位小数
15 startangle=90, #设置饼图的初始角度
16 radius = 0.5, #设置饼图的半径
17 center = (0.2,0.2), #设置饼图的原点
18 textprops = {'fontsize':9, 'color':'k'}, #设置文本标签的属性值
19 pctdistance=0.6)#设置百分比标签与圆心的距离
20 #设置x,y轴刻度一致,保证饼形图为圆形
21 plt.axis('equal')
22 plt.title('2020年1月各省销量占比情况分析')
23 plt.show()
运行程序,输出结果如图 所示 。

图 绘制基础饼形图
分裂饼形图
分裂饼形图是将认为主要的饼形图部分分裂出来,以达到突出显示的目的。
快速示例20 绘制分裂饼形图
将销量占比最多的广东省分裂显示,效果如图5.44所示。分裂饼形图可以同时分裂多块,效果如图 所示。

图 分裂饼形图(1)

图 分裂饼形图(2)
分裂饼形图主要通过设置explode参数实现,该参数用于设置饼形图距中心的距离,我们需要将哪块饼图分裂出来,就设置它与中心的距离即可。例如,上图有10块饼形图,我们将占比最多的“广东省”分裂出来,广东省在第一位,那么就设置第一位距中心的距离为0.1,其他设置为0,关键代码如下:
explode = (0.1,0,0,0,0,0,0,0,0,0)
立体感带阴影的饼形图
立体感带阴影的饼形图看起来更美观,效果如图 所示。

图 立体感带阴影的饼形图
立体感带阴影的饼形图主要通过shadow参数实现,设置该参数值为True即可,关键代码如下:
shadow=True
环形图
快速示例21 绘制环形图分析各省销量的占比情况
环形图是由两个及两个以上大小不一的饼形图叠在一起,去除中间的部分所构成的图形,效果如图 所示。

图 绘制环形图
这里还是通过pie函数实现,一个关键参数wedgeprops,字典类型,用于设置饼形图内外边界的属性,如环的宽度、环边界颜色和宽度,关键代码如下:
wedgeprops = {'width': 0.4, 'edgecolor': 'k'}
内嵌环形图
快速示例22 使用内嵌环形图分析各省销量的占比情况
绘制内嵌环形图实际是双环形图,效果如图 所示。

图 绘制内嵌环形图
绘制内嵌环形图需要注意以下三点:
(1)连续使用两次pie函数。
(2)通过wedgeprops参数设置环形边界。
(3)通过radius参数设置不同的半径。
另外,由于图例内容比较长,为了使得图例能够正常显示,图例代码中引入了两个主要参数:frameon参数设置图例有无边框;bbox_to_anchor参数设置图例位置,关键代码如下:
01#外环
02 plt.pie(x1,autopct='%.1f%%',radius=1,pctdistance=0.85,colors=colors,wedgeprops=dict
(linewidth=2,width=0.3,edgecolor='w'))
03 #内环
04 plt.pie(x2,autopct='%.1f%%',radius=0.7,pctdistance=0.7,colors=colors,wedgeprops=dict
(linewidth=2,width=0.4,edgecolor='w'))
05 #图例
06 legend_text=df1['省']
07 #设置图例标题、位置、去掉图例边框
08 plt.legend(legend_text,title='地区',frameon=False,bbox_to_anchor=(0.2,0.5))
4.5 绘制散点图
散点图主要是用来查看数据的分布情况或相关性,一般用在线性回归分析中,查看数据点在坐标系平面上的分布情况。散点图表示因变量而变化的大致趋势,因此可以选择合适的函数对数据点进行拟合。
散点图与折线图类似,也是一个个点构成的。但不同之处在于,散点图的各点之间不会按照前后关系以线条连接起来。
Matplotlib绘制散点图使用plot函数和scatter函数都可以实现,本节使用scatter函数绘制散点图,scatter函数专门用于绘制散点图,使用方式和plot函数类似,区别在于前者具有更高的灵活性,可以单独控制使得每个散点与数据匹配,并让每个散点具有不同的属性。scatter函数的语法如下:
matplotlib.pyplot.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,data=None, **kwargs)
参数说明:
■ x,y:数据。
■ s:标记大小,以平方磅为单位的标记面积,设置值如下:
● 数值标量:以相同的大小绘制所有标记。
● 行或列向量:使每个标记具有不同的大小。x、y和sz中的相应元素确定每个标记的位置和面积。sz的长度必须等于x和y的长度。
● []:使用36平方磅的默认面积。
■ c:标记颜色,可选参数,默认为蓝色。
■ marker:标记样式,可选参数,默认值图5.48 绘制内嵌环形图
绘制内嵌环形图需要注意以下三点:
(1)连续使用两次pie函数。
(2)通过wedgeprops参数设置环形边界。
(3)通过radius参数设置不同的半径。
另外,由于图例内容比较长,为了使得图例能够正常显示,图例代码中引入了两个主要参数:frameon参数设置图例有无边框;bbox_to_anchor参数设置图例位置,关键代码如下:
01#外环
02 plt.pie(x1,autopct='%.1f%%',radius=1,pctdistance=0.85,colors=colors,wedgeprops=dict
(linewidth=2,width=0.3,edgecolor='w'))
03 #内环
04 plt.pie(x2,autopct='%.1f%%',radius=0.7,pctdistance=0.7,colors=colors,wedgeprops=dict
(linewidth=2,width=0.4,edgecolor='w'))
05 #图例
06 legend_text=df1['省']
07 #设置图例标题、位置、去掉图例边框
08 plt.legend(legend_text,title='地区',frameon=False,bbox_to_anchor=(0.2,0.5))
■ norm:可选参数。
■ vmin,vmax:标量,可选。
■ alpha:透明度,可选参数,0~1之间的数,表示透明度。
■ linewidths:线宽,标记边缘的宽度,可选参数。
■ verts:(x,y)的序列,可选参数,如果参数marker为None,这些顶点将用于构建标记。标记的中心位于在(0,0)为标准化单位。整体标记重新调整由参数s完成。
■ edgecolors:轮廓颜色,和参数c类似,可选参数,默认值为None。
■ data:data关键字参数。如果给定一个数据参数,所有的位置和关键字参数将被替换。
■ **kwargs:关键字参数,其他可选参数。
快速示例23 绘制简单的散点图
绘制一幅简单的散点图,程序代码如下:
01 import matplotlib.pyplot as plt
02 x=[1,2,3,4,5,6]
03 y=[19,24,37,43,55,68]
04 plt.scatter(x, y)
05 plt.show()
运行程序,输出结果如图 所示。

图 绘制简单的散点图
快速示例24 散点图分析销售收入与广告费的相关性
接下来,绘制销售收入与广告费的散点图,用于观察销售收入与广告费的相关性,关键代码如下:
01#x为广告费用,y为销售收入
02 x=pd.DataFrame(dfCar_month['支出'])
03 y=pd.DataFrame(dfData_month['金额'])
04 plt.title('销售收入与广告费散点图') \t#图表标题
05 plt.scatter(x, y, color='red') \t\t#真实值的散点图
运行程序,输出结果如图 所示。

图 绘制销售收入与广告费散点图
4.6 绘制面积图
面积图用于体现数量随时间而变化的程度,也可用于引起人们对总值趋势的注意。例如,表示随时间而变化的利润的数据,可以绘制在面积图中以强调总利润。
Matplotlib绘制面积图主要使用stackplot函数,语法如下:
matplotlib.pyplot.stackplot(x,*args,data=None,**kwargs)
参数说明:
■ x:x轴数据。
■ *args:当传入的参数个数未知时,使用*args。这里指y轴数据中可以传入多个y轴。
■ data:data关键字参数。如果给定一个数据参数,所有位置和关键字参数将被替换。
■ **kwargs:关键字参数,其他可选参数,如color(颜色)、alpha(透明度)等。
快速示例25 绘制简单的面积图
绘制一幅简单的面积图,程序代码如下:
01 import matplotlib.pyplot as plt
02 x = [1,2,3,4,5]
03 y1 =[6,9,5,8,4]
04 y2 = [3,2,5,4,3]
05 y3 =[8,7,8,4,3]
06 y4 = [7,4,6,7,12]
07 plt.stackplot(x, y1,y2,y3,y4, colors=['g','c','r','b'])
08 plt.show()
运行程序,输出结果如图 所示。

图 绘制简单的面积图
面积图也有很多种,如标准面积图、堆叠面积图和百分比堆叠面积图等。下面主要介绍标准面积图和堆叠面积图。
标准面积图
快速示例26 绘制标准面积图分析线上图书的销售情况
通过标准面积图分析2013~2019年线上图书的销售情况,通过该图可以看出每一年线上图书销售的整体趋势,效果如图 所示。

图 绘制标准面积图
程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 df = pd.read_excel('books.xlsx')
04 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
05 x=df['年份']
06 y=df['销售额']
07 #图表标题
08 plt.title('2013-2019年线上图书销售情况')
09 plt.stackplot(x, y)
10 plt.show()
堆叠面积图
快速示例27 堆叠面积图分析各平台图书的销售情况
通过堆叠面积图分析2013~2019年线上各平台图书的销售情况。堆叠面积图不仅可以看到各平台每年销售的变化趋势,通过将各平台数据堆叠到一起还可以看到整体的变化趋势,效果如图 所示。

图 堆叠面积图
实现堆叠面积图的关键在于增加y轴,通过增加多个y轴数据,形成堆叠面积图,关键代码如下:
01 x=df['年份']
02 y1=df['京东']
03 y2=df['天猫']
04 y3=df['自营']
05 plt.stackplot(x, y1,y2,y3,colors=['#6d904f','#fc4f30','#008fd5'])
06 #图例
07 plt.legend(['京东','天猫','自营'],loc='upper left')
08 plt.show()
4.7 绘制热力图
热力图是通过密度函数进行可视化用于表示地图中点的密度的热图。它使人们能够独立于缩放因子感知点的密度。热力图可以显示不可点击区域发生的事情。利用热力图可以看数据表里的多个特征中的两两内容的相似度。例如,以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示。热力图在网页分析、业务数据分析等其他领域也有较为广泛的应用。
快速示例28 绘制简单的热力图
热力图是数据分析的常用方法,通过色差、亮度来展示数据的差异、易于理解。下面绘制简单的热力图,程序代码如下:
01 import matplotlib.pyplot as plt
02 X = [[1,2],[3,4],[5,6],[7,8],[9,10]]
03 plt.imshow(X)
04 plt.show()
运行程序,输出结果如图 所示。

图 绘制简单的热力图
上述代码中,plt.imshow(X)中传入的数组X=[[1,2],[3,4],[5,6],[7,8],[9,10]]是对应的颜色,按照矩阵X进行颜色分布,如左上角的颜色为蓝色,则对应值为1;右下角颜色为黄色,则对应值为10,具体如下:
[1,2][深蓝,蓝色]
[3,4][蓝绿,深绿]
[5,6][海藻绿,春绿色]
[7,8][绿色,浅绿色]
[9,10][草绿色,黄色]
快速示例29 使用热力图对比分析学生各科成绩
将学生成绩统计数据绘制热力图,通过热力图清晰直观地对比每个学生各科成绩的高低,效果如图 所示。从图中得知:颜色高亮表示成绩越高,反之表示成绩越低。

图 绘制学生成绩热力图
程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 df = pd.read_excel('data1.xls',sheet_name='高二一班')
04 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
05 X = df.loc[:,"语文":"生物"].values
06 name=df['姓名']
07 plt.imshow(X)
08 plt.xticks(range(0,6,1),['语文','数学','英语','物理','化学','生物']) #设置x轴刻度标签
09 plt.yticks(range(0,12,1),name) #设置y轴刻度标签
10 plt.colorbar() #显示颜色条
11 plt.title('学生成绩统计热力图')
12 plt.show()
4.8 绘制箱形图
箱形图又称箱线图、盒须图或盒式图,它是一种用作显示一组数据分散情况资料的统计图,因形状像箱子而得名。箱形图最大的优点就是不受异常值的影响(异常值也称为离群值),可以以一种相对稳定的方式描述数据的离散分布情况,因此在各种领域也经常被使用。另外,箱形图也常用于异常值的识别。Matplotlib绘制箱形图主要使用boxplot函数,语法如下:
matplotlib.pyplot.boxplot(x,notch=None,sym=None,vert=None,whis=None,positions=None,widths=None,patch_artist=None,meanline=None,showmeans=None,showcaps=None,showbox=None,showfliers=None,boxprops=None,labels=None,flierprops=None,medianprops=None,meanprops=None,capprops=None,whiskerprops=
None)
参数说明:
■ x:指定要绘制箱形图的数据。
■ notch:是否以凹口的形式展现箱形图,默认非凹口。
■ sym:指定异常点的形状,默认为(+)号显示。
■ vert:是否需要将箱形图垂直摆放,默认垂直摆放。
■ whis:指定上下限与上下四分位的距离,默认为1.5倍的四分位差。
■ positions:指定箱形图的位置,默认为[0,1,2…]。
■ widths:指定箱形图的宽度,默认为0.5。
■ patch_artist:是否填充箱体的颜色。
■ meanline:是否用线的形式表示均值,默认用点来表示。
■ showmeans:是否显示均值,默认不显示。
■ showcaps:是否显示箱形图顶端和末端的两条线,默认显示。
■ showbox:是否显示箱形图的箱体,默认显示。
■ showfliers:是否显示异常值,默认显示。
■ boxprops:设置箱体的属性,如边框色、填充色等。
■ labels:为箱形图添加标签,类似于图例的作用。
■ filerprops:设置异常值的属性,如异常点的形状、大小、填充色等。
■ medianprops:设置中位数的属性,如线的类型、粗细等。
■ meanprops:设置均值的属性,如点的大小、颜色等。
■ capprops:设置箱形图顶端和末端线条的属性,如颜色、粗细等。
■ whiskerprops:设置必须的属性,如颜色、粗细、线的类型等。
快速示例30 绘制简单的箱形图
绘制简单的箱形图,程序代码如下:
01 import matplotlib.pyplot as plt
02 x=[1,2,3,5,7,9]
03 plt.boxplot(x)
04 plt.show()
运行程序,输出结果如图所示。
快速示例31 绘制多组数据的箱形图
上述举例是一组数据的箱形图,还可以绘制多组数据的箱形图,需要指定多组数据。例如,为三组数据绘制箱形图,程序代码如下:
01 import matplotlib.pyplot as plt
02 x1=[1,2,3,5,7,9]
03 x2=[10,22,13,15,8,19]
04 x3=[18,31,18,19,14,29]
05 plt.boxplot([x1,x2,x3])
06 plt.show()
运行程序,输出结果如图 所示。

图 简单的箱形图

图 多组数据的箱形图
箱形图将数据切割分离(实际上就是将数据分为四大部分),如图 所示。

图 箱形图的组成部分
下面介绍箱形图的每部分具体含义以及如何通过箱形图识别异常值。
(1)下四分位数
上图中的下四分位数指的是数据的25%分位点所对应的值(Q1)。计算分位数可以使用Pandas的quantile函数。例如,Q1 = df['总消费'].quantile(q = 0.25)。
(2)中位数
中位数即为数据的50%分位点所对应的值(Q2)。
(3)上四分位数
上四分位数则为数据的75%分位点所对应的值(Q3)。
(4)上限
上限的计算公式为:Q3+1.5(Q3-Q1)。
(5)下限
下限的计算公式为:Q1-1.5(Q3-Q1)。
其中,Q3-Q1表示四分位差。如果使用箱形图识别异常值,其判断标准是,当变量的数据值大于箱形图的上限或者小于箱线图的下限时,就可以将这样的数据判定为异常值。
下面了解一下判断异常值的算法,如图 所示。

图 异常值判断标准
快速示例32 通过箱形图判断异常值
通过箱形图查找客人总消费的数据中存在的异常值,程序代码如下:
01 import matplotlib.pyplot as plt
02 import pandas as pd
03 df=pd.read_excel('tips.xlsx')
04 plt.boxplot(x = df['总消费'], #指定绘制箱线图的数据
05 whis = 1.5, #指定1.5倍的四分位数差
06 widths = 0.3, #指定箱线图中箱子的宽度为0.3
07 patch_artist = True, #填充箱子的颜色
08 showmeans = True, #显示均值
09 boxprops = {'facecolor':'RoyalBlue'}, #指定箱子的填充色为宝蓝色
10 # 指定异常值的填充色、边框色和大小
11 flierprops={'markerfacecolor':'red','markeredgecolor':'red','markersize':3},
12 # 指定中位数的标记符号(虚线)和颜色
13 meanprops = {'marker':'h','markerfacecolor':'black', 'markersize':8},
14 # 指定均值点的标记符号(六边形)、填充色和大小
15 medianprops = {'linestyle':'--','color':'orange'},
16 labels = ['']) # 去除x轴刻度值
17 plt.show()
18 # 计算下四分位数和上四分位数
19 Q1 = df['总消费'].quantile(q = 0.25)
20 Q3 = df['总消费'].quantile(q = 0.75)
21 # 基于1.5倍的四分位数差计算上下限对应的值
22 low_limit = Q1 - 1.5*(Q3 - Q1)
23 up_limit = Q3 + 1.5*(Q3 - Q1)
24 # 查找异常值
25 val=df['总消费'][(df['总消费'] > up_limit) | (df['总消费'] < low_limit)]
26 print('异常值如下:')
27 print(val)
运行程序,输出结果如图 所示。

图 绘制箱形图

图 显示异常值
4.9 绘制3D图表
3D图表有立体感也比较美观,看起来更加地“高大上”。下面介绍两种3D图表:三维柱形图和三维曲面图。
绘制3D图表,我们依旧使用Matplotlib,但需要安装mpl_toolkits工具包,使用如下pip安装命令:
pip install --upgrade matplotlib
安装好这个模块后,即可调用mpl_tookits下的mplot3d类进行3D图表的绘制。
3D柱形图
快速示例33 绘制3D柱形图
下面绘制3D柱形图,程序代码如下:
01 import matplotlib.pyplot as plt
02 from mpl_toolkits.mplot3d.axes3d import Axes3D
03 import numpy as np
04 fig = plt.figure()
05 axes3d = Axes3D(fig)
06 zs = [1, 5, 10, 15, 20]
07 for z in zs:
08 x = np.arange(0, 10)
09 y = np.random.randint(0, 30, size=10)
10 axes3d.bar(x, y, zs=z, zdir='x', color=['r', 'green', 'yellow', 'c'])
11 plt.show()
运行程序,输出结果如图 所示。

图 绘制3D柱形图
3D曲面图
快速示例34 绘制3D曲面图
下面绘制3D曲面图,程序代码如下:
01 import matplotlib.pyplot as plt
02 from mpl_toolkits.mplot3d.axes3d import Axes3D
03 import numpy as np
04 fig = plt.figure()
05 axes3d = Axes3D(fig)
06 x = np.arange(-4.0, 4.0, 0.125)
07 y = np.arange(-3.0, 3.0, 0.125)
08 X, Y = np.meshgrid(x, y)
09 Z1 = np.exp(-X**2 - Y**2)
10 Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
11 #计算Z轴数据(高度数据)
12 Z = (Z1 - Z2) * 2
13 axes3d.plot_surface(X, Y, Z,cmap=plt.get_cmap('rainbow'))
14 plt.show()
运行程序,输出结果如图 所示。

图 绘制3D曲面图
5.10 绘制多个子图表
Matplotlib可以实现在一张图上绘制多个子图表。Matplotlib提供了三种方法:一是使用subplot函数,二是使用subplots函数,三是使用add_subplot函数,下面分别介绍。
subplot函数
subplot函数直接指定划分方式和位置,它可以将一个绘图区域划分为n个子图,每个subplot函数只能绘制一个子图。语法如下:
matplotlib.pyplot.subplot(*args,**kwargs)
参数说明:
■ *args:当传入的参数个数未知时使用*args。
■ **kwargs:关键字参数,其他可选参数。
例如,绘制一个2×3的区域,subplot(2,3,3),将画布分成2行3列在第3个区域中绘制,用坐标表示如下:
(1,1),(1,2),(1,3)
(2,1),(2,2),(2,3)
如果行列的值都小于10,那么可以把它们缩写为一个整数,例如,subplot(233)。
另外,subplot函数在指定的区域中创建一个轴对象,如果新创建的轴和之前创建的轴重叠,那么之前的轴将被删除。
快速示例35 使用subplot函数绘制多子图的空图表
绘制一个2×3包含6个子图的空图表,程序代码如下:
01 import matplotlib.pyplot as plt
02 plt.subplot(2,3,1)
03 plt.subplot(2,3,2)
04 plt.subplot(2,3,3)
05 plt.subplot(2,3,4)
06 plt.subplot(2,3,5)
07 plt.subplot(2,3,6)
08 plt.show()
运行程序,输出结果如图 所示。

图 绘制6个子图的空图表
快速示例36 绘制包含多个子图的图表
通过上述举例了解到subplot函数的基本用法,接下来将前面所学的简单图表整合到一张图表上,效果如图 所示。

图 绘制包含多个子图的图表
程序代码如下:
01 import matplotlib.pyplot as plt
02 #第1个子图表-折线图
03 plt.subplot(2,2,1)
04 plt.plot([1, 2, 3, 4,5])
05 #第2个子图表-散点图
06 plt.subplot(2,2,2)
07 plt.plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro')
08 #第3个子图表-柱形图
09 plt.subplot(2,1,2)
10 x=[1,2,3,4,5,6]
11 height=[10,20,30,40,50,60]
12 plt.bar(x,height)
13 plt.show()
上述举例,两个关键点一定要掌握:
(1)每绘制一个子图表都要调用一次subplot函数。
(2)绘图区域的位置编号。
subplot函数的前面两个参数指定的是一个画布被分割成的行数和列数,后面一个参数则指的是当前绘制区域的位置编号,编号规则是行优先。
例如,图5.64中有3个子图表:第1个子图表subplot(2,2,1),即将画布分成2行2列在第1个子图中绘制折线图;第2个子图表subplot(2,2,2),将画布分成2行2列在第2个子图中绘制散点图;第3个子图表subplot(2,1,2),将画布分成2行1列,由于第1行已经占用了,所以我们在第2行也就是第3个子图中绘制柱形图。如图 所示。

图 多个子图的示意图
subplots函数在画布中绘图时,每次都要调用它来指定绘图区域,非常麻烦,而subplots函数则更直接,它会事先把画布区域分割好。下面介绍subplots函数。
subplots函数
subplots函数用于创建画布和子图,语法如下:
matplotlib.pyplot.subplots(nrows,ncols,sharex,sharey,squeeze,subplot_kw,gridspec_kw,**fig_kw)
参数说明:
■ nrows和ncols:表示将画布分割成几行几列,例如,nrows=2、ncols=2表示将画布分割为2行2列,且起始值都为0,当调用画布中的坐标轴时,ax[0,0]表示调用左上角的坐标,ax[1,1]表示调用右下角的坐标。
■ sharex和sharey:表示坐标轴的属性是否相同,可选的参数:True,False,row,col,默认值均为False,表示画布中的四个ax是相互独立的;当sharex = True, sharey = True时,生成的四个ax的所有坐标轴拥有相同的属性;当sharex = True, sharey = 'row'时,当sharex = True, sharey = 'col'时,当sharex = 'row', sharey = 'row'时;当sharex = 'row', sharey = 'col'时;当sharex = 'col', sharey = 'col'时。
■ squeeze:布尔型,默认值为True,额外的维度从返回的Axes(轴)对象中挤出,对于N×1或1×N个子图,返回一个一维数组,对于N×M,N>1和M>1返回一个二维数组;如果值为False,则表示不进行挤压操作,返回一个元素为Axes实例的二维数组,即使它最终是1×1。
■ subplot_kw:字典类型,可选参数。把字典的关键字传递给add_subplot来创建每个子图。
■ gridspec_kw:字典类型,可选参数。把字典的关键字传递给GridSpec构造函数创建网格区域,然后将子图放在网格里。
■ **fig_kw:把所有详细的关键字参数传给figure。
快速示例37 使用subplots函数绘制多子图的空图表
绘制一个2×3包含6个子图的空图表,使用subplots函数只需如下三行代码:
01 import matplotlib.pyplot as plt
02 figure,axes=plt.subplots(2,3)
03 plt.show()
上述代码中,figure和axes是两个关键点:
(1)figure:绘制图表的画布。
(2)axes:坐标轴对象,可以理解为在figure(画布)上绘图坐标轴对象,它帮我们规划出了一个个科学作图的坐标轴系统。
通过图 所示的示意图读者就会明白,绿色是画布(figure);白色带坐标轴的坐标轴对象(axes)。

图 坐标系统示意图
快速示例38 使用subplots函数绘制多子图图表
使用subplots函数将前面所学的简单图表整合到一张图表上,效果如图 所示

图 绘制多子图图表
程序代码如下:
01 import matplotlib.pyplot as plt
02 figure,axes=plt.subplots(2,2)
03 axes[0,0].plot([1, 2, 3, 4,5]) #第1个子图表-折线图
04 axes[0,1].plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro') #第2个子图表-散点图
05 #第3个子图表-柱形图
06 x=[1,2,3,4,5,6]
07 height=[10,20,30,40,50,60]
08 axes[1,0].bar(x,height)
09 #第4个子图表-饼形图
10 x = [2,5,12,70,2,9]
11 axes[1,1].pie(x,autopct='%1.1f%%')
12 plt.show()
5.6.10.3 add_subplot函数
快速示例39 使用add_subplot函数绘制多子图图表
add_subplot函数也可以实现在一张图上绘制多个子图表,用法与subplot函数基本相同,先来看一段代码:
01 import matplotlib.pyplot as plt
02 fig = plt.figure()
03 ax1 = fig.add_subplot(2,3,1)
04 ax2 = fig.add_subplot(2,3,2)
05 ax3 = fig.add_subplot(2,3,3)
06 ax4 = fig.add_subplot(2,3,4)
07 ax5 = fig.add_subplot(2,3,5)
08 ax6 = fig.add_subplot(2,3,6)
09 plt.show()
上述代码同样是绘制一个2×3包含6个子图的空图表。首先创建figure实例(画布),然后通过'ax1 = fig.add_subplot(2,3,1)'创建第1个子图表,返回Axes实例(坐标轴对象),第1个参数为行数;第2个参数为列数,第3个参数为子图表的位置。
以上用3种方法实现了在一张图上绘制多个子图表,3种方法各有所长。subplot方法和add_subplot方法比较灵活,定制化效果比较好,可以实现子图表在图中的各种布局(如一张图上的3个图表或5个图表可以随意摆放),而subplots方法就不那么灵活,但它可以用较少的代码实现绘制多个子图表。
4.11 图表的保存
在实际工作中,有时需要将绘制的图表保存为图片放置到报告中。Matplotlib的savefig函数可以实现这一功能,将图表保存为JPEG、TIFF或PNG格式的图片。
例如,保存之前绘制的折线图,关键代码如下:
plt.savefig('image.png')
需要注意的一个关键问题:保存代码必须在图表预览前,也就是plt.show方法前,否则保存后的图片是白色,图表无法保存。
运行程序,图表被保存在程序所在路径下,名称为image.png,如图 所示。

图 保存后的图表
五、Seaborn图表
Seaborn是一个基于Matplotlib的高级可视化效果库,偏向于统计图表。因此,针对的主要是数据挖掘和机器学习中的变量特征选取。相比Matplotlib,它的语法相对简单,绘制图表时不需要花很多功夫去修饰,但是它的绘图方式会比较局限,不够灵活。
5.1 Seaborn图表概述
Seaborn是基于Matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在Matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,不需要经过大量的调整就能使图表变得非常精致。
Seaborn主要包括以下功能:
■ 计算多变量间关系的面向数据集接口。
■ 可视化类别变量的观测与统计。
■ 可视化单变量或多变量分布并,与其子数据集比较。
■ 控制线性回归的不同因变量并进行参数估计与作图。
■ 对复杂数据进行整体结构可视化。
■ 对多表统计图的制作高度抽象并简化可视化过程。
■ 提供多个主题渲染Matplotlib图表的样式。
■ 提供调色板工具生动再现数据。
Seaborn还提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表,如图 所示。

图 Seaborn绘制各种图表
接下来进入安装环节,利用pip工具安装,命令如下:
pip install seaborn
或者,在Pycharm开发环境中安装。需要注意的是,如果安装报错,可能是由于没有安装Scipy模块,因为Seaborn依赖于Scipy,所以需要先安装Scipy。
5.2 Seaborn图表之初体验
快速示例40 绘制简单的柱形图
准备工作完成后,先来绘制一款简单的柱形图,程序代码如下:
01 import seaborn as sns
02 import matplotlib.pyplot as plt
03 sns.set_style('darkgrid')
04 plt.figure(figsize=(4,3))
05 x=[1,2,3,4,5]
06 y=[10,20,30,40,50]
07 sns.barplot(x,y)
08 plt.show()
运行程序,输出结果如图 所示。

图 绘制简单的柱形图
Seaborn默认的灰色网格底色灵感来源于Matplotlib却更加柔和。在大多数情况下,图应优于表。Seaborn的默认灰色网格底色避免了刺目的干扰。
上述举例,实现了简单的柱形图,每个柱子指定了不同的颜色,并且设置了特殊的背景风格。接下来,看一下它是如何一步步实现的。
(1)首先,导入必要的模块Seaborn和Matplotlib,由于Seaborn模块是Matplotlib模块的补充,所以绘制图表前必须引用Matplotlib模块。
(2)设置Seaborn的背景风格为darkgrid。
(3)指定x轴、y轴数据。
(4)使用barplot函数绘制柱形图。
5.3 Seaborn图表的基本设置
背景风格
设置Seaborn的背景风格,主要使用axes_style函数和set_style函数。Seaborn有5个背景主题,适用于不同的应用场景和人群偏好,具体如下:
■ darkgrid:灰色网格(默认值)。
■ whitegrid:白色网格。
■ dark:灰色背景。
■ white:白色背景。
■ ticks:四周带刻度线的白色背景
网格能够帮助我们查找图表中的定量信息,而灰色网格主题中的白线能避免影响数据的表现,白色网格主题则更适合表达“重数据元素”。
边框控制
控制边框显示方式,主要使用despine函数。
(1)移除顶部和右边边框。
sns.despine()
(2)使两个坐标轴离开一段距离。
sns.despine(offset=10, trim=True)
(3)移除左边边框,与set_style方法的白色网格配合使用效果更佳。
sns.set_style("whitegrid")
sns.despine(left=True)
(4)移除指定边框,设置值为True即可。
sns.despine(fig=None, ax=None, top=True, right=True, left=True, bottom=False, offset=None, trim=False)
设置后的效果如图 所示。

图 设置后的效果
5.4 常用图表的绘制
绘制折线图
在Seaborn中实现折线图有两种方法:一是在relplot函数中通过设置kind参数为line;二是使用lineplot函数直接绘制折线图。
(1)使用relplot函数。
快速示例41 绘制学生语文成绩折线图(1)
使用relplot函数绘制学生语文成绩的折线图,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 import seaborn as sns
04 sns.set_style('darkgrid') #灰色网格
05 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
06 df1=pd.read_excel('data.xls') #导入Excel文件
07 #绘制折线图
08 sns.relplot(x="学号", y="语文", kind="line", data=df1)
09 plt.show() #显示
运行程序,输出结果如图 所示。

图 绘制学生语文成绩的折线图
(2)使用lineplot函数。
快速示例42 绘制学生语文成绩折线图(2)
使用lineplot函数绘制学生语文成绩折线图,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 import seaborn as sns
04 sns.set_style('darkgrid')
05 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
06 df1=pd.read_excel('data.xls') #导入Excel文件
07 #绘制折线图
08 sns.lineplot(x="学号", y="语文",data=df1)
09 plt.show() #显示
快速示例43 多折线图分析学生的各科成绩
现在绘制多折线图来分析学生的各科成绩,关键代码如下:
01 dfs=[df1['语文'],df1['数学'],df1['英语']]
02 sns.lineplot(data=dfs)
运行程序,输出结果如图 所示。

图 绘制多折线图
绘制直方图
Seaborn绘制直方图主要使用displot函数,语法如下:
sns.distplot(data,bins=None,hist=True,kde=True,rug=False,fit=None,color=None,axlabel=None,ax=None)
常用参数说明:
■ data:数据。
■ bins:设置矩形图数量。
■ hist:是否显示条形图。
■ kde:是否显示核密度估计图,默认值为True,显示核密度估计图。
■ rug:是否在x轴上显示观测的小细条(边际毛毯)。
■ fit:拟合的参数分布图形。
快速示例44 绘制简单的直方图
绘制简单的直方图,效果如图 所示

图 绘制直方图
程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 import seaborn as sns
04 sns.set_style('darkgrid')
05 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
06 df1=pd.read_excel('data2.xls') #导入Excel文件
07 data=df1[['得分']]
08 sns.distplot(data,rug=True) #直方图,显示观测的小细条
09 plt.show() #显示
绘制条形图
Seaborn绘制条形图主要使用barplot函数,语法如下:
sns.barplot(x=None,y=None,hue=None,data=None,order=None,hue_order=None,orient=None,color=None, palette=None,capsize=None,estimator=mean)
常用参数说明:
■ x、y:x轴、y轴数据。
■ hue:分类字段。
■ order、hue_order:变量绘图顺序。
■ orient:条形图是水平显示还是竖直显示。
■ capsize:误差线的宽度。
■ estimator:每类变量的统计方式,默认值为平均值mean。
快速示例45 多条形图分析学生的各科成绩
通过前面学习,已经能够绘制简单的条形图了。下面绘制学生成绩的多条形图,效果如图 所示。

图 绘制条形图
程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 import seaborn as sns
04 sns.set_style('darkgrid')
05 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
06 df1=pd.read_excel('data.xls',sheet_name='sheet2') #导入Excel文件
07 sns.barplot(x='学号',y='得分',hue='学科',data=df1) #条形图
08 plt.show() #显示
绘制散点图
Seaborn绘制散点图主要使用replot函数,相关语法可参考“绘制折线图”。
快速示例46 绘制散点图分析“小费”
下面通过Seaborn提供的内置数据集tips(小费数据集)绘制散点图,效果如图 所示。

图 绘制散点图
程序代码如下:
01 import matplotlib.pyplot as plt
02 import seaborn as sns
03 sns.set_style('darkgrid')
04 #加载内置数据集tips(小费数据集),并对total_bill和tip字段绘制散点图
05 tips=sns.load_dataset('tips')
06 sns.relplot(x='total_bill',y='tip',data=tips,color='r')
07 plt.show()#显示
技巧:上述代码使用了内置数据集tips,下面简单介绍一下该数据集。首先通过tips.head方法显示部分数据,来看下tips的数据结构,如图 所示。

图 tips的部分数据
图 中的字段说明如下:
■ total_bill:表示总消费。
■ tip:表示小费。
■ sex:表示性别。
■ smoker:表示是否吸烟。
■ day:表示周几。
■ time:表示用餐类型。如早餐、午餐、晚餐(breakfast、lunch、dinner)
■ size:用餐人数。
绘制线性回归模型(lmplot函数)
Seaborn可以直接绘制线性回归模型,用于描述线性关系,主要使用lmplot函数,语法如下:
sns.lmplot(x,y,data,hue=None,col=None,row=None,palette=None,col_wrap=3,size=5,markers='o')
常用参数说明:
■ hue:散点图中的分类字段。
■ col:列分类变量,构成子集。
■ row:行分类变量。
■ col_wrap:控制每行子图的数量。
■ size:控制子图的高度。
■ markers:点的形状。
快速示例47 使用线性回归图表分析“小费”
同样使用tips数据集,绘制线性回归图,关键代码如下:
sns.lmplot(x='total_bill',y='tip',data=tips)
运行程序,输出结果如图 所示。

图 绘制线性回归图
绘制箱形图(boxplot函数)
Seaborn绘制箱形图主要使用boxplot函数,语法如下:
sns.boxplot(x=None,y=None,hue=None,data=None,order=None,hue_order=None,orient=None,color=None,palette=None, width=0.8,notch=False)
常用参数说明:
■ hue:分类字段。
■ width:箱形图的宽度。
■ notch:中间箱体是否显示缺口,默认值为False。
快速示例48 绘制箱形图分析“小费”中的异常数据
绘制一个箱形图,使用数据集tips演示,查看异常数据关键代码如下:
sns.boxplot(x='day',y='total_bill',hue='time',data=tips)
运行程序,输出结果如图 所示。

图 绘制箱形图
从上图得知:数据存在异常值。箱形图实际上就是利用数据的分位数来识别数据的异常点,这一特点使得箱形图在学术界和工业界的应用非常广泛。
绘制核密度图(kdeplot函数)
核密度是概率论中用来估计未知的密度函数,属于非参数检验的方法之一。通过核密度图可以比较直观地看出数据样本本身的分布特征。
Seaborn绘制核密度图主要使用kdeplot函数,语法如下:
sns.kdeplot(data,shade=True)
参数说明:
■ data:数据。
■ shade:是否带阴影,默认值为True,带阴影。
快速示例49 绘制核密度图分析“鸢尾花”
绘制核密度图,通过Seaborn自带的数据集iris演示,对“鸢尾花”进行分析,关键代码如下:
01 #调用seaborn自带数据集iris
02 df = sns.load_dataset('iris')
03 #绘制多个变量的核密度图
04 p1=sns.kdeplot(df['sepal_width'], shade=True, color="r")
05 p1=sns.kdeplot(df['sepal_length'], shade=True, color="b")
运行程序,输出结果如图5.81所示。
下面再介绍一种边际核密度图,该图可以更好地体现两个变量之间的关系,如图 所示。

图 绘制核密度图

图 绘制边际核密度图
关键代码如下:
sns.jointplot(x=df["sepal_length"], y=df["sepal_width"], kind='kde',space=0)
绘制提琴图(violinplot函数)
提琴图结合了箱形图和核密度图的特征,用于展示数据的分布形状。粗黑线表示四分数范围,延伸的细线表示95%的置信区间,白点为中位数,如图5.83所示。提琴图弥补了箱型图的不足,可以展示数据分布是双模还是多模。提琴图主要使用violinplot函数绘制。
快速示例50 绘制提琴图分析“小费”
绘制提琴图,通过Seaborn自带的数据集tips演示,关键代码如下:
sns.violinplot(x='total_bill',y='day',hue='time',data=tips)
运行程序,输出结果如图 所示。

图 绘制提琴图
六、综合应用
案例1:双Y轴可视化数据分析图表的实现
双y轴,顾名思义就是两个y轴,其特点是可以通过双y轴看出发展情况的同时,还可以看到其增长速度。对于产品而言,通过此图看到产品销量的同时还可以看到产品增长率,效果如图 所示。

图 双y轴可视化数据分析图表
双y轴可视化数据分析图表的实现主要使用add_suplot函数中的twinx函数。twinx函数表示共享x轴,那么也就是一个x轴和两个y轴,程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 df=pd.read_excel('mrbook.xlsx') #导入Excel文件
04 x=[1,2,3,4,5,6]
05 y1=df['销量']
06 y2=df['rate']
07 fig = plt.figure()
08 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
09 plt.rcParams['axes.unicode_minus'] = False #用来正常地显示负号
10 ax1 = fig.add_subplot(111) #添加子图
11 plt.title('销量情况对比') #图表标题
12 #图表x轴标题
13 plt.xticks(x,['1月','2月','3月','4月','5月','6月'])
14 ax1.bar(x,y1,label='left')
15 ax1.set_ylabel('销量(册)') #y轴标签
16 ax2 = ax1.twinx() #共享x轴,添加一条y轴坐标轴
17 ax2.plot(x,y2,color='black',linestyle='--',marker='o',linewidth=2,label=u"增长率")
18 ax2.set_ylabel(u"增长率")
19 for a,b in zip(x,y2):
20 plt.text(a, b+0.02, '%.2f' % b, ha='center', va= 'bottom',fontsize=10,color='red')
21 plt.show()
案例2:堆叠柱形图可视化数据分析图表的实现
堆叠柱形图可以直观、贴切地反映出不同产品、不同人群的体验效果,一目了然。例如,“明日科技”男女会员的分布情况,效果如图 所示。

图 绘制堆叠柱形图
关键代码如下:
01 #计算男性用户比例
02 ratio=np.array(men_list)/(np.array(men_list)+np.array(women_list))
03 np.set_printoptions(precision=2) #使用set_printoptions方法设置输出的精度
04 #设置男、女生的消费金额
05 men = num * ratio
06 women = num * (1-ratio)
07 df3=df2.drop_duplicates(['类别']) #去除类别重复的记录
08 name=(list(df3['类别']))
09 #生成图表
10 x = name
11 width = 0.5
12 idx = np.arange(len(x))
13 plt.bar(idx, men, width,color='slateblue', label='男性用户')
14 plt.bar(idx, women, width, bottom=men, color='orange', label='女性用户')
15 plt.xlabel('消费类别')
16 plt.ylabel('男女分布')
17 plt.xticks(idx+width/2, x, rotation=20)
18 #在图表上显示数字
19 for a,b in zip(idx,men):
20 #对齐方式'top', 'bottom', 'center', 'baseline', 'center_baseline'
21 plt.text(a, b, '%.0f' % b, ha='center', va='top',fontsize=12)
22 for a,b,c in zip(idx,women,men):
23 plt.text(a, b+c+0.5, '%.0f' % b, ha='center', va= 'bottom',fontsize=12)
24 plt.legend()
25 plt.show()
案例3:颜色渐变饼形图的实现
在绘制图表过程中,每一次都苦于颜色设置的问题,在数据较多的情况下,不知道该如何配色,手动配色费时费力。下面绘制渐变颜色的饼形图,根据所占比例自动配置渐变色,占比越大颜色越深,占比越小颜色越浅,省去了手动配色的麻烦,而且占比情况一目了然,效果如图 所示。

图 绘制渐变色饼形图
颜色渐变主要使用了Matplotlib内置的颜色地图模块cm,在该模块中指定一组数据可以生成多种颜色,由浅入深。例如,渐变蓝色,'cmap=plt.cm.Blues'。
下面来绘制颜色渐变的饼形图,程序代码如下:
01 from matplotlib import font_manager as fm
02 import pandas as pd
03 import numpy as np
04 import matplotlib.pyplot as plt
05 plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
06 plt.style.use('ggplot')
07 from matplotlib import cm
08 #原始数据
09 shapes = ['天津', '江西省', '安徽省', '云南省', '福建省', '河南省', '辽宁省',
10 '重庆', '湖南省', '四川省', '北京', '上海', '广西壮族自治区', '河北省',
11 '浙江省', '江苏省', '湖北省', '山东省', '广东省']
12 values = [287,383,842,866,1187,1405,1495,1620,1717,2313,2378,3070,4332,5841,6482,7785,9358,9818,20254]
14 s = pd.Series(values, index=shapes)
15 labels = s.index
16 sizes = s.values
17 fig, ax = plt.subplots(figsize=(6,6)) #设置绘图的区域大小
18 colors = cm.rainbow(np.arange(len(sizes))/len(sizes)) #颜色地图:秋天→彩虹→灰色→春天→黑色
19 patches, texts, autotexts = ax.pie(sizes, labels=labels, autopct='%1.0f%%',shadow=False, startangle=170, colors=colors)
21 ax.axis('equal')
22 ax.set_title('各省线上图书销售占比图', loc='left')
23 #重新设置字体大小
24 tproptease = fm.FontProperties()
25 #字体大小(从小到大): xx-small、x-small、small、medium、large、x-large、xx-large,或者是数字,如18
26 proptease.set_size('small')
27 plt.setp(autotexts, fontproperties=proptease)
28 plt.setp(texts, fontproperties=proptease)
29 plt.show()
案例4:等高线图的实现
等高线图是在地理课中讲述山峰山谷时绘制的图形,在机器学习中也会被用在绘制梯度下降算法的图形中。等高线图的实现效果如图 所示。

图 绘制等高线图
程序代码如下:
01 import numpy as np
02 import matplotlib.pyplot as plt
03 #计算x,y坐标对应的高度值
04 def f(x, y):
05 return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2)
06 #生成x,y的数据
07 n = 256
08 x = np.linspace(-3, 3, n)
09 y = np.linspace(-3, 3, n)
10 #把x,y数据转换为二维数据
11 X, Y = np.meshgrid(x, y)
12 #填充等高线
13 plt.contourf(X, Y, f(X, Y))
14 #显示图表
15 plt.show()
关键代码解析:
要画出等高线,核心函数是Matplotlib的contourf函数,但这个函数中的参数x和y对应的值是二维数据,因此需要使用NumPy的meshgrid方法,将x和y值转换成二维数据,代码如下:
np.meshgrid(x, y)
案例5:统计双色球中奖数字热力图
下面通过Seaborn热力图统计我们抓取的2014~2019年的双色球中奖数据中,每一位中奖号码数字出现的次数的分布情况,效果如图 所示。

图 统计双色球中奖数字热力图
图中的前6位是红色球,第7位是蓝色球,颜色越浅出现的次数越多。从分析结果得知:红色球第1位“01”和第6位“33”出现的次数最多,蓝色球第7位“12”出现的次数最多,总体看蓝色球中的各个数字出现的次数差不多;同时我们也看到,红色球大多数在前几位是很少出现的,而小数在后几位很少出现。
程序代码如下:
01 import pandas as pd
02 import matplotlib.pyplot as plt
03 import seaborn as sns
04 sns.set() #使用默认设置
05 plt.figure(figsize=(6,6))
06 plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
07 df=pd.read_csv('data.csv',encoding='gb2312') #导入Excel文件
08 series=df['中奖号码'].str.split(' ',expand=True) #提取每一位的中奖号码
09 #对每一位的中奖号码统计出现次数
10 df1=df.groupby(series[0]).size()
11 df2=df.groupby(series[1]).size()
12 df3=df.groupby(series[2]).size()
13 df4=df.groupby(series[3]).size()
14 df5=df.groupby(series[4]).size()
15 df6=df.groupby(series[5]).size()
16 df7=df.groupby(series[6]).size()
17 #横向表合并(行对齐)
18 data = pd.concat([df1,df2,df3,df4,df5,df6,df7], axis=1,sort=True)
19 data=data.fillna(0) #空值NaN替换为0
20 data=data.round(0).astype(int) #浮点数转换为整数
21 plt.title('统计2014~2019年双色球中奖数字热力图')
22 sns.heatmap(data,annot=True, fmt='d', lw=0.5) #绘制热力图
23 plt.xlabel('中奖号码位数')
24 plt.ylabel('双色球数字')
25 x=['第1位','第2位','第3位','第4位','第5位','第6位','第7位']
26 plt.xticks(range(0,7,1),x,ha='left')
27 plt.show()
上述代码中,使用了Seaborn的heatmap函数来绘制热力图,其中annot参数控制数值是否显示;fmt参数控制数值的格式,lw参数为线宽,cmap参数控制使用的颜色模式。

