matplotlib可用来绘制多种类型的分析图表,详细绘图函数可参考官方文档,以下介绍几种常用图表及其作用:
- 折线图:反应变化趋势
- 柱状图/条形图:展示分类数据
- 直方图/质量分布图:展示数据分布情况,观察异常或孤立数据
- 散点图/X-Y图:显示变量之间的相互影响程度:正相关、负相关、不相关、线性相关、指数相关等
- 饼状图:展示分类占比情况
- 箱线图/Box-plot/盒须图/盒式图/箱型图:显示一组数据分散情况资料的统计图,反应原始数据分布的特征。
matplotlib常用图表
matplotlib是一个相当底层的工具,可用来绘制多种图表
折线图
Series和DataFrame都有一个plot
属性,用于绘制基本图形。默认情况下,plot()
绘制的是折线图。
Series对象的索引传入matplotlib作为绘图的x轴,可以通过use_index=False
来禁用这个功能。x轴的刻度和范围可以通过xticks
和xlim
选项进行调整,相应的y轴使用yticks
和ylim
进行调整。
1 | import matplotlib.pyplot as plt |
Series.plot函数的参数汇总:
参数 | 描述 |
---|---|
label | 图例标签 |
ax | 绘图的子图对象,如果没传值则使用当前活动的子图 |
style | matplotlib的样式字符串,比如’ko–’ |
alpha | 图片不透明度(从0到1) |
kind | 可以是’area’,’bar’,’barh’,’density’,’hist’,’kde’,’line’,’pie’ |
logy | 在y轴上使用对数缩放 |
use_index | 使用对象索引刻度标签 |
rot | 刻度标签的旋转(0到360) |
xticks | 用于x轴刻度的值 |
yticks | 用于y轴刻度的值 |
xlim | x轴的范围 |
ylim | y轴的范围 |
grid | 展示轴网格,默认是打开的 |
DataFrame的plot方法在同一个子图中将每一列绘制为不同折线
1 | import matplotlib.pyplot as plt |
DataFrame.plot函数的参数汇总:
参数 | 描述 |
---|---|
subplots | 将DataFrame的每一列绘制在独立的子图中 |
sharex | 如果subplots=True,则共享x轴 |
sharey | 如果subplots=True,则共享y轴 |
figsize | 用于生成图片尺寸的元组 |
title | 标题字符串 |
legend | 添加子图图例,默认是True |
sort_columns | 按字母顺序绘制各列,默认按照已有的列顺序 |
条形图
matplotlib中绘制条形图的方式和折线图类似,只是把方法换成了plt.bar
方法
基本条形图和横向条形图
plot.bar()
和 plot.barh()
可以分别绘制垂直和水平的条形图,Series和DataFrame的索引将会被用作x轴刻度(bar)和y轴刻度(barh)
1 | import matplotlib.pyplot as plt |
分组条形图和堆叠条形图
在DataFrame中,柱状图将每一行中的值分组到并排的柱子中的一组
1 | import matplotlib.pyplot as plt |
Genus | A | B | C | D |
---|---|---|---|---|
one | 0.353679 | 0.304355 | 0.073192 | 0.548517 |
two | 0.6799 | 0.455715 | 0.821993 | 0.18753 |
three | 0.344149 | 0.186175 | 0.800043 | 0.698891 |
four | 0.314402 | 0.410393 | 0.38402 | 0.452544 |
five | 0.757186 | 0.052099 | 0.437517 | 0.140023 |
six | 0.62013 | 0.687367 | 0.478689 | 0.24141 |
条形图应用举例
假设想要绘制一个分组柱状图,用于展示每个派对在每天的数据点占比,可以先载入文件:
1 | import matplotlib.pyplot as plt |
对于在绘图前需要聚合或者汇总的数据,使用seaborn的包会更加简单:
1 | import matplotlib.pyplot as plt |
因为day列中有多个观测值,柱子的值是tip_pct的平均值。柱子上的黑线代表95%的置信区间
直方图和密度图
直方图是一种条形图,用于给出值频率的离散显示,利用上面小费的数据,可以通过matplotlib的plt.hist
方法来绘制,或者用Series的plot.hist
方法制作小费占总费用百分比的直方图
1 | import matplotlib.pyplot as plt |
密度图是一种与直方图相关的图表类型,它通过计算可能产生观测数据的连续概率分布估计而产生。plot.kde
方法可以绘制密度图
1 | import matplotlib.pyplot as plt |
使用seaborn的distplot
函数可以绘制直方图和连续密度估计
1 | import matplotlib.pyplot as plt |
散点图
散点图可以用于检验两个一维数据序列之间的关系,使用matplotlib中的plt.scatter
方法可以绘制散点图,seaborn的regplot
方法能够绘制散点图,并拟合出一个线性回归线;seaborn的pairplot
函数能够方便地绘制一组变量中所有的散点图,在对角线上放置每个变量的直方图或密度估计值
1 | import matplotlib.pyplot as plt |
plot_ksw
参数使我们能够将配置选项传递给非对角元素上的各个绘图
饼图
饼图是一个划分为几个扇形的圆形统计图表,用于描述量、频率或百分比之间的相对关系。在matplotlib中,可以通过plt.pie
来实现,其参数如下:
x
:饼图的比例序列labels
:饼图上每个分块的名称文字explode
:设置某几个分块是否要分离饼图autopct
:设置比例文字的展示方式shadow
:是否显示阴影textprops
:文本的属性其他参数
:参考官方文档。
返回值:
- patches:饼图上每个分块的对象
- texts:分块的名字文本对象
- autotexts:分块的比例文字对象
现在有一组数据,用来记录各个操作系统的市场份额,那么用饼状图表示如下:
1 | import numpy as np |
箱线图
箱线图(Box-plot)又称盒须图、盒式图或箱型图,是一种用作显示一组数据分散情况资料的统计图。
箱线图绘制方法:
取一组数据的上限值、下限值、中位数(Q2)、下四分位数(Q1)、上四分位数(Q3);
连接两个四分位数画出箱子;
将最大值和最小值与箱子相连,中位数在箱子中间
数学概念
- 四分位数(Quartile)也称四分位点,是指统计学中把所有数值由小到大排列并分成四等份,处于25%和75%位置上的值。
四分位数计算方法:
- IQR = Q3 - Q1
- 上限 = Q3 + 1.5IQR
- 下限 = Q1 - 1.5IQR
箱型图应用场景
- 识别数据中的异常值
- 判断数据的偏态
- 比较几批数据的形状
- 适合多组数据,单组数据建议使用直方图
在matplotlib中使用plt.boxplot
来绘制箱线图,主要参数有:
x
:需要绘制的箱线图数据notch
:是否展示置信区间,默认是Falsesym
:代表异常点点符号,默认是小圆点vert
:是否是垂直的,默认是Truewhis
:上下限的系数,默认是1.5,也可以改成其他值或序列positions
:设置每个盒子的位置widths
:设置每个盒子的宽度labels
:设置每个盒子的标签meanline
和showmeans
:如果这两个都为True,将会绘制平均值的线条
示例代码如下:
1 | import numpy as np |
雷达图
雷达图(Radar Chart)又被叫做蜘蛛网图,适用于显示三个或更多的维度的变量的强弱情况,比如英雄联盟中某个影响的属性(法术伤害、物理防御等),或者某个企业在哪些业务方面的投入等,也可以用雷达图展示。在matplotlib中使用plt.polar
方法绘制雷达图,这个方法和plt.plot
方法很类似,只不过x轴的坐标点是弧度(2*PI=360度),示例代码如下:
1 | import numpy as np |
注意点:
- 因为polar并不会完全闭合曲线,所以在绘制时需要在theta和values中最后多重复添加第0个位置多值,用于完成封闭曲线
- polar只是绘制线条,如果需要填充颜色,可以使用fill函数
- polar默认的圆圈坐标是角度,如果要改成文字显示,可以通过xticks来设置
使用子图绘制雷达图
在多子图中,绘制对象不再是pyplot
而是Axes
,而Axes
及其子类绘制雷达图则是通过将直角坐标转变成极坐标,然后再绘制折线图,示例代码如下:
使用
plt.subplot
绘制的子图:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
# 为了得到封闭曲线,在5项参数后,增加一项空值
properties = ['输出','KDA','发育','团战','生存','']
# 为了达到封闭效果,最后一项的值与第一项的值相等
values = [40,91,44,90,95,40]
# 0-360度,平均分成6等份
theta = np.linspace(0,np.pi*2,6)
# 生成一个子图,并指定子图的类型为polar
axes = plt.subplot(121,projection='polar')
# 绘制雷达图
axes.plot(theta,values)
# 修改x轴标签
plt.xticks(theta,properties,fontproperties=font)
# 填充颜色
axes.fill(theta,values)
plt.show()使用
plt.subplots
绘制的子图1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
# 为了得到封闭曲线,在5项参数后,增加一项空值
properties = ['输出','KDA','发育','团战','生存','']
# 为了达到封闭效果,最后一项的值与第一项的值相等
values = [40,91,44,90,95,40]
# 0-360度,平均分成6等份
theta = np.linspace(0,np.pi*2,6)
# 创建子图,并指定子图的类型为polar
figure,axes = plt.subplots(1,2,subplot_kw={"projection":"polar"})
# 绘制散点图
axes[0].plot(theta,values)
# 修改x轴标签
axes[0].set_xticks(theta,properties,fontproperties=font)
# 填充颜色
axes[0].fill(theta,values)
plt.show(0)使用
fig.add_subplot
绘制的子图1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager
font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")
# 为了得到封闭曲线,在5项参数后,增加一项空值
properties = ['输出','KDA','发育','团战','生存','']
# 为了达到封闭效果,最后一项的值与第一项的值相等
values = [40,91,44,90,95,40]
# 0-360度,平均分成6等份
theta = np.linspace(0,np.pi*2,6)
# 创建画布
fig = plt.figure(figsize=(10,10))
# 在画布上添加子图
axes = fig.add_subplot(121,polar=True)
# 在子图中绘制雷达图
axes.plot(theta,values)
# 修改x轴标签
plt.xticks(theta,properties,fontproperties=font)
# 填充颜色
axes.fill(theta,values)
plt.show()
分面网格和分类数据
seaborn又一个有效内建函数factorplot
,可以简化多种分面绘图,回到前面小费的例子
1 | import matplotlib.pyplot as plt |
matplotlib官方网址:https://matplotlib.org/stable/index.html