MATPLOTLIB 数据可视化 · 学习笔记

第2章 使用 matplotlib 绘制简单图表

涵盖折线图、柱形图、条形图、堆积面积图、直方图、饼图/圆环图、散点图/气泡图、箱形图、雷达图、误差棒图共 10 类图表的绘图函数、核心参数与实例要点。

目标 1掌握绘制折线图、柱形图或堆积柱形图
目标 2掌握绘制条形图或堆积条形图、堆积面积图、直方图
目标 3掌握绘制饼图或圆环图、散点图或气泡图
目标 4掌握绘制箱形图、雷达图、误差棒图

2.1绘制折线图 — plot()

使用 pyplot 的 plot() 函数可以快速地绘制折线图。

语法

plot(x, y, fmt, scalex=True, scaley=True, data=None, label=None, *args, **kwargs)
  • x、y:表示 x 轴与 y 轴的数据
  • fmt:定义图的基本属性的字符串,形式为 '[color][marker][line]',即颜色、点型、线型
  • label:图例标签
  • 返回值:一个包含 Line2D 类对象(代表线条)的列表

绘制多线条折线图的三种方式

# 第1种:分别调用
plt.plot(x1, y1)
plt.plot(x2, y2)

# 第2种:一次传入多组数据
plt.plot(x1, y1, x2, y2)

# 第3种:传入二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
plt.plot(arr[0], arr[1:])
实例1 未来15天最高气温和最低气温:将日期列作为 x 轴数据,最高气温和最低气温两列作为 y 轴数据,用 plot() 绘制两条对比折线。

2.2绘制柱形图或堆积柱形图 — bar()

使用 pyplot 的 bar() 函数可以快速地绘制柱形图或堆积柱形图,返回一个 BarContainer 类的对象(可遍历获取每个柱形,也可通过 patches 或 errorbar 属性获取所有柱形或误差棒)。

语法

bar(x, height, width=0.8, bottom=None, align='center', tick_label=None, xerr=None, yerr=None, **kwargs)
  • x:柱形的 x 坐标;height:柱形的高度
  • width:柱形的宽度,默认 0.8
  • bottom:柱形底部的 y 坐标(用于堆积)
  • align:柱形与刻度的对齐方式,默认 'center'
  • tick_label:x 轴刻度标签
  • xerr、yerr:误差棒数据

示例代码

# 一组柱形
x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
plt.bar(x, y1, tick_label=['a','b','c','d','e'], width=0.3)

# 两组柱形(并列)
y2 = np.array([9, 6, 5, 10, 12])
plt.bar(x, y1, width=0.3)
plt.bar(x + 0.3, y2, width=0.3)

# 堆积柱形图:通过 bottom 参数使后绘制的柱形位于先绘制的上方
plt.bar(x, y1, width=0.3)
plt.bar(x, y2, bottom=y1, width=0.3)

# 带误差棒的柱形图
error = [2, 1, 2.5, 2, 1.5]
plt.bar(x, y1, width=0.3, yerr=error)
实例2 2013~2019财年阿里巴巴淘宝和天猫平台的GMV:财年列作为 x 轴,GMV 列作为 y 轴,绘制柱形图,柱形宽度设为 0.5,y 轴单位为亿元(2019财年GMV超60000亿元)。

2.3绘制条形图或堆积条形图 — barh()

使用 pyplot 的 barh() 函数可以快速地绘制条形图或堆积条形图(横向柱形图),同样返回 BarContainer 类的对象。

语法

barh(y, width, height=0.8, left=None, align='center', *, **kwargs)
  • y:条形的 y 坐标;width:条形的宽度(x 方向长度)
  • height:条形的高度,默认 0.8
  • left:条形左侧的 x 坐标(用于堆积)
  • xerr、yerr:误差棒数据

示例代码

# 一组条形
y = np.arange(5)
x1 = np.array([10, 8, 7, 11, 13])
plt.barh(y, x1, tick_label=['a','b','c','d','e'], height=0.3)

# 两组条形(并列):y + bar_height
x2 = np.array([9, 6, 5, 10, 12])
plt.barh(y + 0.3, x2, height=0.3)

# 堆积条形图:通过 left 参数使后绘制的条形位于先绘制的右方
plt.barh(y, x1, height=0.3)
plt.barh(y, x2, left=x1, height=0.3)

# 带误差棒的条形图
plt.barh(y, x1, height=0.3, xerr=error)
实例3 各商品种类的网购替代率:商品种类列作为 y 轴刻度标签,替代率列作为 x 轴数据,绘制条形图,条形高度为 0.6。

2.4绘制堆积面积图 — stackplot()

使用 pyplot 的 stackplot() 函数可以快速地绘制堆积面积图。

语法

stackplot(x, y, labels=(), baseline='zero', data=None, *args, **kwargs)
  • x:x 轴数据,可以是一组数据
  • y:y 轴数据,可以是一组或多组数据
  • labels:每个填充区域的图例标签
  • baseline:计算基线的方法,可选 'zero'(常数基线)、'sym'(对称基线)、'wiggle'、'weighted_wiggle'(河流图风格,最小化层的摆动)

示例代码

x = np.arange(6)
y1 = np.array([1, 4, 3, 5, 6, 7])
y2 = np.array([1, 3, 4, 2, 7, 6])
y3 = np.array([3, 4, 3, 6, 5, 5])
# 绘制有三个填充区域堆叠的堆积面积图
plt.stackplot(x, y1, y2, y3)
实例4 物流公司物流费用统计:月份列作为 x 轴刻度标签,A公司、B公司、C公司三列物流费用作为 y 轴数据,绘制堆积面积图,展示三家公司在各月份的费用占比及总量变化。

2.5绘制直方图 — hist()

使用 pyplot 的 hist() 函数可以快速地绘制直方图,用于统计数据的分布情况。

语法

hist(x, bins=None, range=None, density=None, weights=None, bottom=None, **kwargs)
  • x:输入数据(一维数组)
  • bins:矩形条的个数或取值范围边界序列
  • range:统计数据的取值区间,区间外的数据将被忽略
  • density:是否将矩形条进行频率统计(归一化)
  • weights:每个数据的权重
  • bottom:每个矩形条底部的 y 坐标(基线偏移)
  • histtype:直方图类型,如 'bar'、'step'、'stepfilled'(填充的线条)

示例代码

# 准备50个随机测试数据,绘制填充的线条直方图
scores = np.random.randint(0, 100, 50)
plt.hist(scores, bins=8, histtype='stepfilled')

# 10000个随机数,绘制包含25个矩形条的直方图
random_state = np.random.RandomState(19680801)
random_x = random_state.randn(10000)
plt.hist(random_x, bins=25)
实例5 人脸识别的灰度直方图:使用一组 10000 个随机数模拟人脸图像的灰度值,绘制包含 25 个矩形条的灰度直方图(x 轴为灰度值,y 轴为频率)。

2.6绘制饼图或圆环图 — pie()

使用 pyplot 的 pie() 函数可以快速地绘制饼图或圆环图。

语法

pie(x, explode=None, labels=None, autopct=None, pctdistance=0.6, startangle=None, *, data=None)
  • x:扇形的数据(各部分数值)
  • explode:扇形离开圆心的距离(数组,突出某部分)
  • labels:扇形的标签文字
  • autopct:百分比数值的格式字符串,如 '%3.1f%%'(保留1位小数)
  • pctdistance:百分比数值距圆心的半径比例,默认 0.6
  • startangle:起始绘制角度(从 x 轴正方向逆时针计)
  • radius:扇形半径;shadow:是否显示阴影;wedgeprops:扇形属性,如 {'width': 0.7} 可绘制圆环图

示例代码

data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])

# 饼图:半径1.5,数值保留1位小数
plt.pie(data, radius=1.5, labels=pie_labels, autopct='%3.1f%%')

# 圆环图:通过 wedgeprops 挖空中间
plt.pie(data, radius=1.5, wedgeprops={'width': 0.7},
        labels=pie_labels, autopct='%3.1f%%', pctdistance=0.75)
实例6 支付宝月账单报告:分类列作为饼图标签,各分类金额占总支出金额的比例作为饼图数据,显示阴影、起始角度为 90°、扇形离开圆心距离 0.1(突出最大支出分类)。

2.7绘制散点图或气泡图 — scatter()

使用 pyplot 的 scatter() 函数可以快速地绘制散点图或气泡图。

语法

scatter(x, y, s=None, c=None, marker=None, cmap=None, linewidths=None, edgecolors=None, *, **kwargs)
  • x、y:点的坐标数据
  • s:点的大小(用于气泡图)
  • c:点的颜色
  • marker:点的样式
  • cmap:颜色映射表
  • linewidths、edgecolors:点的轮廓线宽与轮廓颜色

示例代码

num = 50
x = np.random.rand(num)
y = np.random.rand(num)

# 散点图
plt.scatter(x, y)

# 气泡图:s 控制气泡大小
area = (30 * np.random.rand(num)) ** 2
plt.scatter(x, y, s=area)
实例7 汽车速度与制动距离的关系:车速(km/h)列作为 x 轴数据,制动距离(m)列作为 y 轴数据,绘制散点图。车速增加 1 倍,制动距离将增大至近 4 倍。

2.8绘制箱形图 — boxplot()

使用 pyplot 的 boxplot() 函数可以快速地绘制箱形图,用于展示数据的分布(最小值、下四分位数、中位数、上四分位数、最大值及异常值)。

语法

boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, *, data=None)
  • x:待绘制的数据
  • notch:是否以凹口形式展现箱形图
  • sym:异常值对应的符号
  • vert:箱体垂直还是水平摆放(False 为横向)
  • whis:四分位距的倍数,指定上下须与四分位数的距离
  • positions:箱体的位置;widths:箱体的宽度
  • 常用参数:patch_artist(是否填充箱体颜色)、showfliers(是否显示异常值)、meanline(是否用线显示均值/中位数)

示例代码

# 绘制不显示异常值的箱形图
data = np.random.randn(100)
plt.boxplot(data, meanline=True, widths=0.3,
            patch_artist=True, showfliers=False)
实例8 2017年和2018年全国发电量统计:发电量(亿千瓦时)列作为 x 轴数据,2017年和2018年作为 y 轴刻度标签,绘制横向箱形图。结果显示:2017年发电量中位数约 4800~5300 亿千瓦时,2018年约 5250~5700 亿千瓦时;箱体宽度 0.5、填充颜色、显示异常值与中位数。

2.9绘制雷达图 — polar()

使用 pyplot 的 polar() 函数可以快速地绘制雷达图(极坐标图)。

语法

polar(theta, r, **kwargs)
  • theta:每个标记所在弧度(角度)的数据
  • r:每个标记到极点的半径距离数据
  • 通常需先将角度转换为弧度,并在数据末尾追加第一个点以闭合多边形
实例9 霍兰德职业兴趣测试:霍兰德职业兴趣测试是美国职业指导专家霍兰德编制的测评工具。将标题一行(现实型、研究型、艺术型、社会型、企业型、常规型 6 个维度)的数据作为雷达图的标签,其余各行(6 位用户)的数据作为雷达图数据,用 polar() 绘制多组对比的雷达图。

2.10绘制误差棒图 — errorbar()

使用 pyplot 的 errorbar() 函数可以快速地绘制误差棒图。

语法

errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, *, data=None, **kwargs)
  • x、y:数据点的位置
  • yerr、xerr:y 轴 / x 轴方向误差的大小
  • fmt:数据点的标记样式与线条样式
  • ecolor:误差棒的颜色;elinewidth:误差棒线宽
  • capsize:误差棒端帽的大小;capthick:端帽粗细

示例代码

x = np.arange(5)
y = (25, 32, 34, 20, 25)
y_offset = (3, 5, 2, 3, 3)
plt.errorbar(x, y, yerr=y_offset, capsize=3, capthick=2)
实例10 4个树种不同季节的细根生物量:细根生物量反映根系从土壤中吸收水分和养分的能力,不同树种细根生物量存在差异。将季节列作为 x 轴刻度标签,马尾松、樟树、杉木、桂花四列数据作为 y 轴数据,用 errorbar() 绘制带误差棒的对比图。

2.11本章小结

本章主要介绍了如何使用 matplotlib 库的绘图函数绘制简单的图表,包括: 折线图(plot)、柱形图/堆积柱形图(bar)、条形图/堆积条形图(barh)、 堆积面积图(stackplot)、直方图(hist)、饼图/圆环图(pie)、 散点图/气泡图(scatter)、箱形图(boxplot)、雷达图(polar)、 误差棒图(errorbar)。 掌握这些绘图函数的用法后,可以使用它们绘制简单图表,为后续学习打好扎实的基础。

图表类型函数堆积方式 / 关键参数
折线图plot()多线条:多次调用 / 一次传多组 / 二维数组
柱形图bar()堆积用 bottom;误差棒用 yerr
条形图barh()堆积用 left;误差棒用 xerr
堆积面积图stackplot()baseline:zero / sym / wiggle / weighted_wiggle
直方图hist()bins 条数;histtype='stepfilled' 填充
饼图/圆环图pie()wedgeprops={'width':0.7} 圆环;autopct 百分比
散点图/气泡图scatter()s 控制点大小(气泡)
箱形图boxplot()patch_artist 填充;showfliers 异常值;vert 摆放方向
雷达图polar()theta 角度(弧度)+ r 半径
误差棒图errorbar()xerr / yerr 误差;capsize、capthick 端帽