©[悠悠智汇笔记] 版权所有
🙏请尊重劳动成果,守护每一份劳动成果;⚖️未经授权,不得以为任何方式转载、摘编或抄袭。🔄转载合作请后台联系授权,侵权必究。
01简介
Matplotlib 是 Python 中最常用的二维绘图库之一,适用于数据可视化的各种场景,具有高灵活性和强大的自定义能力。
02安装和调用
pip install matplotlib # 使用 pip 安装 matplotlib
或使用 conda:
conda install matplotlib # 使用 conda 安装 matplotlib
导入方式
import matplotlib.pyplot as plt # 导入 matplotlib 的 pyplot 模块import numpy as np # numpy 常用于生成数据
03基本组件
Matplotlib 图像是由多个组件构成的:
04参数设置
Matplotlib 提供两种主要的参数设置方式:
• 全局样式设置(通过 matplotlib.rcParams 或 plt.rc())
• 局部绘图函数中的参数传入(如 plt.plot(..., linewidth=2, color='r'))
常见全局参数(rcParams)
设置方式:
import matplotlib as mplmpl.rcParams['figure.figsize'] = (8, 6) # 设置全局图像尺寸mpl.rcParams['axes.titlesize'] = 14# 设置坐标轴标题大小
使用 plt.rc() 快速设置多项参数:
plt.rc('axes', titlesize=16, labelsize=12) # 同时设置标题和标签字体大小plt.rc('xtick', labelsize=10) # 设置x轴刻度标签字体大小
设置中文显示与负号正常显示:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑体,支持中文plt.rcParams['axes.unicode_minus'] = False# 正常显示负号(防止乱码)
格式化坐标轴刻度:
from matplotlib.ticker import FuncFormatterdefpercent_formatter(x, pos):returnf'{x*100:.0f}%'# 将数值格式化为百分比ax.yaxis.set_major_formatter(FuncFormatter(percent_formatter)) # 应用于y轴
颜色、线型、标记参数:
示例:
plt.plot(x, y, color='green', linestyle='--', marker='o', linewidth=2, markersize=6) # 绿色虚线圆点图
图例参数设置:
plt.legend(loc='upper right', fontsize=12, frameon=True, shadow=True) # 设置图例位置和样式
05常用绘图函数
06绘图示例
6.1 折线图 plot()
import matplotlib.pyplot as pltimport numpy as npplt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体plt.rcParams['axes.unicode_minus'] = False# 正确显示负号(防止乱码)x = np.linspace(, 10, 100) # 生成从0到10共100个点的等距数据y = np.sin(x) # 计算每个x点对应的正弦值plt.plot(x, y, # x和y数据 color='blue', # 线条颜色 linestyle='--', # 虚线风格,可以是'-', '--', '-.', ':' linewidth=2, # 线宽 marker='o', # 标记点的样式:o圆形,s方块等 markersize=4, # 标记点大小 label='sin(x)') # 图例标签plt.xlabel('x') # x轴标题plt.ylabel('sin(x)') # y轴标题plt.title('折线图示例') # 图标题plt.legend() # 显示图例plt.grid(True) # 添加网格plt.show()
6.2 散点图 scatter()
import matplotlib.pyplot as pltimport numpy as npplt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体plt.rcParams['axes.unicode_minus'] = False# 正确显示负号(防止乱码)x = np.linspace(, 10, 100) # 生成从0到10共100个点的等距数据y = np.sin(x) # 计算每个x点对应的正弦值plt.plot(x, y, # x和y数据 color='blue', # 线条颜色 linestyle='--', # 虚线风格,可以是'-', '--', '-.', ':' linewidth=2, # 线宽 marker='o', # 标记点的样式:o圆形,s方块等 markersize=4, # 标记点大小 label='sin(x)') # 图例标签plt.xlabel('x') # x轴标题plt.ylabel('sin(x)') # y轴标题plt.title('折线图示例') # 图标题plt.legend() # 显示图例plt.grid(True) # 添加网格plt.show()
6.3 柱状图 bar()
categories = ['A', 'B', 'C', 'D']values = [23, 45, 56, 78]plt.bar(categories, values, color='skyblue', # 柱子颜色 edgecolor='black', # 边缘线颜色 width=0.6, # 柱子的宽度,默认0.8 align='center') # 柱子与x轴对齐方式plt.xlabel('类别')plt.ylabel('数值')plt.title('柱状图示例')plt.grid(axis='y') # 仅显示y轴方向网格线plt.show()
6.4 直方图 hist()
data = np.random.randn(1000) # 生成1000个正态分布的随机数据plt.hist(data, bins=30, # 分箱数量 color='orange', # 柱子颜色 edgecolor='black', # 边缘颜色 alpha=0.8, # 透明度 density=True) # 是否显示密度(归一化)plt.xlabel('取值')plt.ylabel('频率密度')plt.title('直方图示例')plt.grid(True)plt.show()
6.5 箱线图 boxplot()
data = [np.random.normal(loc, 1.0, 100) for loc in [, 1, 2]] # 生成3组不同中心的数据plt.boxplot(data, notch=True, # 是否有缺口(展示中位数置信区间) patch_artist=True, # 是否填充颜色 boxprops=dict(facecolor='lightblue', color='black'), # 箱体样式 medianprops=dict(color='red'), # 中位数线条颜色 widths=0.6) # 箱子宽度plt.xticks([1, 2, 3], ['组1', '组2', '组3']) # 设置x轴标签plt.title('箱线图示例')plt.grid(True)plt.show()
6.6 饼图 pie()
labels = ['苹果', '香蕉', '葡萄', '梨']sizes = [30, 25, 25, 20]explode = [0.1, , , ] # 苹果部分稍微突出plt.pie(sizes, labels=labels, # 每部分标签 explode=explode, # 设置突出显示 autopct='%1.1f%%', # 百分比格式 startangle=90, # 起始角度 colors=['#ff9999','#66b3ff','#99ff99','#ffcc99'], # 颜色 shadow=True) # 是否添加阴影plt.title('饼图示例')plt.axis('equal') # 保持比例为圆形plt.show()
6.7等高线图 contour() / contourf()
import numpy as npimport matplotlib.pyplot as plt# 创建网格数据x = np.linspace(-3, 3, 100)y = np.linspace(-3, 3, 100)X, Y = np.meshgrid(x, y) # 构造二维网格坐标Z = np.sin(np.sqrt(X**2 + Y**2)) # 计算等高线函数值plt.contour(X, Y, Z, levels=10, colors='black') # 绘制等高线contour_filled = plt.contourf(X, Y, Z, levels=20, cmap='viridis') # 填充等高区域plt.colorbar(contour_filled, label='值') # 添加色条plt.title('等高线图')plt.xlabel('X')plt.ylabel('Y')plt.axis('equal') # 保持比例一致plt.grid(True)plt.show()
6.8误差棒图 errorbar()
x = np.arange(, 10, 1)y = np.exp(-0.1 * x)error = 0.1 * y # 每个点的误差值plt.errorbar(x, y, yerr=error, # 垂直方向的误差值 fmt='-o', # 折线和圆形标记 color='blue', # 主线颜色 ecolor='red', # 误差棒颜色 elinewidth=2, # 误差棒宽度 capsize=5, # 误差棒两端横线宽度 label='指数衰减')plt.title('误差棒图示例')plt.xlabel('时间')plt.ylabel('值')plt.legend()plt.grid(True)plt.show()
6.9面积图 stackplot()
x = np.arange(1, 6)y1 = [1, 3, 4, 5, 2]y2 = [2, 4, 1, 2, 1]y3 = [1, 2, 3, 1, 3]plt.stackplot(x, y1, y2, y3, labels=['系列 A', '系列 B', '系列 C'], colors=['#ff9999','#66b3ff','#99ff99'], alpha=0.8)plt.legend(loc='upper left')plt.title('堆叠面积图示例')plt.xlabel('时间')plt.ylabel('累计值')plt.grid(True)plt.show()
6.10 极坐标图(subplot(..., polar=True))
theta = np.linspace(, 2 * np.pi, 100) # 角度值(弧度)r = np.abs(np.sin(2 * theta)) # 半径为 sin(2θ) 的绝对值fig, ax = plt.subplots(subplot_kw={'polar': True}) # 创建极坐标子图ax.plot(theta, r, color='green', linewidth=2) # 绘图ax.set_title('极坐标图')plt.show()
6.11 风玫瑰图(极坐标柱状图)
theta = np.linspace(, 2*np.pi, 8, endpoint=False) # 8 个方向radii = [5, 3, 4, 2, 6, 7, 4, 3] # 每个方向的频率fig, ax = plt.subplots(subplot_kw={'polar': True})bars = ax.bar(theta, radii, width=0.5, # 每个柱子的宽度 bottom=0.0, # 从圆心开始 color='lightblue', # 柱子的填充色 edgecolor='black') # 柱子边缘色ax.set_title('风玫瑰图示例')plt.show()
6.12 三维图 plot_surface()
from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cm # colormapimport numpy as npimport matplotlib.pyplot as pltx = np.linspace(-5, 5, 100)y = np.linspace(-5, 5, 100)X, Y = np.meshgrid(x, y)Z = np.sin(np.sqrt(X**2 + Y**2)) # 构造 z = sin(sqrt(x^2 + y^2))fig = plt.figure()ax = fig.add_subplot(111, projection='3d') # 创建三维坐标轴surf = ax.plot_surface(X, Y, Z, cmap=cm.viridis, # 使用 Viridis 颜色映射 edgecolor='none') # 不显示网格边框ax.set_title('三维曲面图')ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10) # 添加色条plt.show()
07总结标题
7.1使用plt.subplot() 创建简单子图
import matplotlib.pyplot as pltimport numpy as npx = np.linspace(, 10, 100)y1 = np.sin(x)y2 = np.cos(x)plt.subplot(2, 1, 1) # 创建2行1列的子图,激活第1个plt.plot(x, y1, label='sin(x)')plt.title('子图 1:正弦函数')plt.grid(True)plt.subplot(2, 1, 2) # 创建2行1列的子图,激活第2个plt.plot(x, y2, label='cos(x)', color='orange')plt.title('子图 2:余弦函数')plt.grid(True)plt.tight_layout() # 自动调整子图间距plt.show()
7.2使用 plt.subplot() 创建简单子图
fig, axes = plt.subplots(2, 2, figsize=(10, 6)) # 创建2行2列的子图网格x = np.linspace(, 2 * np.pi, 100)axes[, ].plot(x, np.sin(x))axes[, ].set_title("sin(x)")axes[, 1].plot(x, np.cos(x))axes[, 1].set_title("cos(x)")axes[1, ].plot(x, np.tan(x))axes[1, ].set_title("tan(x)")axes[1, ].set_ylim(-5, 5)axes[1, 1].axis('off') # 空白子图plt.tight_layout()plt.show()
7.3 使用 GridSpec 自定义网格布局
import matplotlib.gridspec as gridspecfig = plt.figure(figsize=(8, 6))gs = gridspec.GridSpec(3, 3) # 创建3x3网格# 子图1占据(0, 0)-(1, 1)ax1 = fig.add_subplot(gs[, :2])ax1.set_title("子图 1:占据前两列")# 子图2占据(0,2)-(1,2)ax2 = fig.add_subplot(gs[, 2])ax2.set_title("子图 2:单列")# 子图3跨两行ax3 = fig.add_subplot(gs[1:, :2])ax3.set_title("子图 3:跨两行")# 子图4正常ax4 = fig.add_subplot(gs[1:, 2])ax4.set_title("子图 4")plt.tight_layout()plt.show()
7.4 sharex / sharey:共享坐标轴
fig, axs = plt.subplots(2, 2, sharex=True, sharey=True) # 所有子图共享x和y轴x = np.linspace(, 10, 100)for i inrange(2):for j inrange(2): axs[i, j].plot(x, np.sin(x + i + j)) axs[i, j].set_title(f"子图 {i},{j}")plt.tight_layout()plt.show()
最后,附上一张合集,供参考~