外观
Matplotlib
Matplotlib 可以把它看成 Python 世界里的“老牌绘图引擎”。如果数据需要变成图,它通常是第一批被请上场的工具之一。设计目标很直接:把数据变成可视化结果,而且尽量接近 MATLAB 的使用体验,所以名字里就有个 “mat”。
它的核心能力是二维绘图:折线图、散点图、柱状图、直方图、饼图、热力图这些基础图形都能稳定产出。底层是面向对象的绘图系统,上层又提供了一个接近“命令式脚本风格”的接口(pyplot)。多数人先用 pyplot,因为写起来像这样一路画下去,心智负担小;等需要精细控制时,再切换到面向对象接口去精调坐标轴、子图、刻度、样式。
典型工作流程很朴素:准备数据 → 创建图和坐标轴 → 调用绘图函数 → 调整样式 → 显示或保存。它和 NumPy、Pandas 贴合度很高,数组或 Series 往里一塞就能画。很多高级可视化库(比如 seaborn)本质上也是在 Matplotlib 上包了一层“更省心的语法糖”。
Matplotlib 绘图示例
绘制一个图,需要导入 matplotlib.pyplot 模块,然后设置中文字体,准备数据,
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = ["Times New Roman", "SimSun"] # 英文字体为新罗马,中文字体为宋体
plt.rcParams["font.serif"] = ["Times New Roman", "SimSun"] # 衬线字体
plt.rcParams["font.sans-serif"] = ["Times New Roman", "SimSun", "Arial", "SimHei"] # 无衬线字体,与Latex相关
plt.rcParams["mathtext.fontset"] = "custom" # 设置LaTeX字体为用户自定义,这里演示,就不用computer modern了
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(10, 5), dpi=200) # 创建画布
x = [i for i in range(1, 25)] # X轴信息
y = [-8, -8, -8, -7, -7, -7, -6, -6, -7, -5, -4, -1, 1, 1, 2, 1, -1, -4, -4, -5, -5, -6, -7, -7]
x_labels = [f"{i:2d}:00" for i in x[::2]]
y_labels = [f"{i}℃" for i in y]
plt.plot(x, y, linewidth=1)
plt.xticks(x[::2], x_labels)
plt.yticks(y, y_labels)
plt.title("沈阳24小时气温变化", pad=10)
plt.xlabel("时间", labelpad=10)
plt.ylabel("气温", labelpad=10)
plt.grid(True, linestyle="--", linewidth=0.5)
plt.show()
Matplotlib 图形结构
可结合上一个图形对比查看。

Matplotlib 图形种类
折线图
matplotlib.pyplot.plot(x, y, ...): 绘制折线图,用于展示数据随时间或类别的变化趋势。
常用参数:
x, y: x 轴和 y 轴的数据序列color/c: 线条颜色,支持颜色名称('r' 红色、'b' 蓝色)或十六进制('#FF5733')linestyle/ls: 线条样式,'-' 实线、'--' 虚线、':' 点线、'-.' 点划线linewidth/lw: 线条宽度,默认 1.0marker: 标记点样式,'o' 圆点、's' 方块、'^' 上三角、'd' 菱形、'x' 叉号markersize/ms: 标记点大小markerfacecolor/mfc: 标记点填充颜色markeredgecolor/mec: 标记点边缘颜色alpha: 透明度,0-1 之间的值label: 图例标签,配合plt.legend()使用
import random
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5), dpi=100)
x = [i for i in range(1, 11)]
y1 = [random.uniform(3, 5) for i in range(10)]
y2 = [random.uniform(4, 6) for i in range(10)]
plt.plot(x, y1, color='steelblue', linestyle='--', linewidth=2,
marker='o', markersize=6, label='Series A')
plt.plot(x, y2, color='#FF6B6B', linestyle='-', linewidth=2,
marker='s', markersize=6, label='Series B')
plt.ylim(2, 8)
plt.legend()
plt.show()
柱状图
matplotlib.pyplot.bar(x, height, ...): 绘制柱状图,用于比较不同类别的数值大小。
常用参数:
x: 柱子的 x 轴位置height: 柱子的高度width: 柱子宽度,默认 0.8bottom: 柱子底部的 y 坐标,用于堆叠柱状图color/c: 柱子颜色edgecolor/ec: 柱子边缘颜色linewidth/lw: 边缘线宽alpha: 透明度align: 柱子对齐方式,'center'(默认)或 'edge'label: 图例标签hatch: 填充纹理,'/' 斜线、'\' 反斜线、'x' 交叉线、'.' 点状
import random
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5), dpi=100)
x = [i for i in range(1, 11)]
y1 = [random.randint(1, 101) for i in range(10)]
plt.bar(x, y1, width=0.6, color='skyblue', edgecolor='navy',
linewidth=1.2, alpha=0.8, label='Value')
plt.ylim(0, 100)
plt.legend()
plt.show()
直方图
matplotlib.pyplot.hist(x, ...): 绘制直方图,用于展示数据的分布情况。
常用参数:
x: 输入数据序列bins: 柱子数量或边界,可以是整数、序列或字符串('auto'、'fd'、'doane'、'scott'、'stone'、'rice'、'sturges'、'sqrt')range: 数据范围,元组 (min, max)density: 是否归一化为概率密度,默认 Falseweights: 每个数据点的权重cumulative: 是否绘制累积分布,默认 Falsebottom: 柱子底部的 y 坐标histtype: 直方图类型,'bar'(默认并列)、'barstacked'(堆叠)、'step'(阶梯)、'stepfilled'align: 柱子对齐,'left'、'mid'(默认)、'right'orientation: 方向,'vertical'(默认)或 'horizontal'color/c: 柱子颜色edgecolor/ec: 边缘颜色linewidth/lw: 边缘线宽alpha: 透明度
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据(正态分布)
data = np.random.randn(1000)
plt.figure(figsize=(10, 5), dpi=100)
plt.hist(data, bins=30, color='steelblue', edgecolor='black',
linewidth=0.8, alpha=0.7, density=True)
plt.show()
饼图
matplotlib.pyplot.pie(x, ...): 绘制饼图,用于展示各部分占整体的比例。
常用参数:
x: 各扇形的数值(自动计算比例)explode: 扇形偏离圆心的距离数组,用于突出显示某块labels: 各扇形的标签colors: 扇形颜色列表autopct: 百分比显示格式,如 '%1.1f%%' 显示一位小数pctdistance: 百分比文本距圆心的距离,默认 0.6shadow: 是否添加阴影,默认 Falselabeldistance: 标签距圆心的距离,默认 1.1startangle: 起始角度,默认从 x 轴正方向逆时针radius: 饼图半径,默认 1counterclock: 是否逆时针绘制,默认 Truewedgeprops: 扇形属性字典,如textprops: 文本属性字典center: 饼图中心位置,默认 (0, 0)frame: 是否绘制坐标轴框架,默认 False
import matplotlib.pyplot as plt
# 饼图数据
labels = ['Apple', 'Banana', 'Orange', 'Grape', 'Mango']
sizes = [30, 20, 15, 25, 10]
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc']
explode = [0, 0, 0, 0.1, 0] # 突出显示 Grape
plt.figure(figsize=(8, 8), dpi=100)
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', startangle=90,
wedgeprops={'linewidth': 1, 'edgecolor': 'white'},
textprops={'fontsize': 12})
plt.title('Pie Chart Example')
plt.show()
散点图
matplotlib.pyplot.scatter(x, y, ...): 绘制散点图,用于展示两个变量之间的关系。
常用参数:
x, y: 点的 x 和 y 坐标s: 点的大小,可以是标量或与数据等长的数组c/color: 点的颜色,可以是颜色、颜色列表或与数据等长的数组(配合 cmap 使用)marker: 标记样式,'o' 圆点、's' 方块、'^' 三角、'd' 菱形、'p' 五边形、'*' 星形cmap: 颜色映射,当 c 为数组时使用,如 'viridis'、'plasma'、'coolwarm'、'jet'alpha: 透明度,0-1 之间的值linewidths/lw: 标记边缘线宽edgecolors/ec: 标记边缘颜色label: 图例标签vmin, vmax: 颜色映射的范围norm: 颜色归一化对象
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(42)
x = np.random.randn(100)
y = np.random.randn(100)
colors = np.random.rand(100)
sizes = np.random.rand(100) * 300
plt.figure(figsize=(10, 6), dpi=100)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.6, cmap='viridis',
edgecolors='black', linewidths=0.5)
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.title('Scatter Plot Example')
plt.colorbar(label='Color Value')
plt.show()
Matplotlib 辅助绘图
plt.xticks(ticks=None, labels=None, **kwargs):设置或获取横轴刻度,作用是控制 x 轴“刻度位置”和“刻度显示文字”。
常见用法有三种层级:
1)只设置刻度位置
plt.xticks([0, 1, 2, 3, 4])2)同时设置位置 + 显示标签
plt.xticks(
[0, 1, 2, 3],
["10:00", "10:30", "11:00", "11:30"]
)3)控制刻度样式(通过 kwargs)
plt.xticks(
[0, 1, 2, 3],
fontsize=12,
rotation=45 # 旋转角度,时间标签常用
)常用参数说明:
- ticks:刻度位置列表
- labels:刻度文字列表(长度必须和 ticks 一致)
- rotation:旋转角度
- fontsize:字体大小
- color:刻度文字颜色
同理:
plt.yticks(...):设置或获取纵轴刻度。 参数和 xticks 完全同构,行为一致,只是作用在 y 轴。
plt.grid(True, linestyle='--', alpha=0.5):显示网格线
作用是提高读图精度,让视觉系统更容易估计数值位置。
常见参数:
plt.grid(
True, # 是否显示
linestyle='--', # 线型:'-' '--' '-.' ':'
linewidth=1, # 线宽
color='gray', # 颜色
alpha=0.5 # 透明度
)进阶用法:只开某个方向的网格
plt.grid(axis='x') # 只显示竖向网格
plt.grid(axis='y') # 只显示横向网格plt.xlabel() / plt.ylabel():设置坐标轴名称
plt.xlabel("时间", fontsize=14)
plt.ylabel("温度(℃)", fontsize=14)常见参数:
- fontsize:字号
- labelpad:与轴的间距
- loc:位置(left / right / center,较新版本支持)
plt.title():设置图标题
plt.title(
"中午11点到12点温度变化",
fontsize=20,
loc='center'
)可用参数:
- fontsize:字号
- loc:位置(left / center / right)
- pad:和图像的间距
多语言环境经常遇到一个现实问题:中文可能乱码。那是字体问题,需要先设置中文字体,否则 matplotlib 默认字体库不含中文字符。
plt.savefig("test.png"):保存图片到文件。
这是绘图流程里的“落盘指令”,不调用就只会显示,不会保存。
常用增强参数:
plt.savefig(
"test.png",
dpi=300, # 分辨率(打印/论文必调)
bbox_inches="tight", # 去掉多余白边
transparent=False # 是否透明背景
)关键细节顺序规则:
先 savefig,再 show。
plt.savefig("test.png")
plt.show()因为在某些后端环境里,show() 会清空当前图像缓冲区,导致保存到空图。
Matplotlib 常见问题
中文显示方块
这是 Matplotlib 没有正确加载字体导致的,在导入 Matplotlib 后添加如下代码即可。
plt.rcParams["font.family"] = ["Times New Roman", "SimSun"] # 英文字体为新罗马,中文字体为宋体
plt.rcParams["font.serif"] = ["Times New Roman", "SimSun"] # 衬线字体
plt.rcParams["font.sans-serif"] = ["Times New Roman", "SimSun", "Arial", "SimHei"] # 无衬线字体,与Latex相关
plt.rcParams["mathtext.fontset"] = "custom" # 设置LaTeX字体为用户自定义,这里演示,就不用computer modern了
plt.rcParams["axes.unicode_minus"] = False