Matplotlib 全攻略:从基础图表到高级可视化案例详解

Matplotlib模块

1.Matplotlib 简介

Matplotlib 是 Python 中最流行的数据可视化库之一,提供了一套完整的数据可视化工具,能够创建静态、动态或交互式的图表。它被广泛应用于科学计算、数据分析、机器学习等领域。

安装

pip install matplotlib

导入方式

# 基本导入方式
import matplotlib.pyplot as plt
# 通常与 NumPy 一起使用
import numpy as np  
# 设置中文显示的字体(黑体)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 设置负号显示
plt.rcParams['axes.unicode_minus'] = False

2.基础绘制

创建第一个图表

image-20250514103838757
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
# 从0~10 之间取100个等距点 作为x轴数据
x = np.linspace(0, 10,100)
# print(x)
y = np.sin(x) # map(sin, arr)
# print(y)

# 创建图表
# 设置图表大小 宽8英寸 高4英寸
plt.figure(figsize=(8,4))
# 绘制折线图 将x轴数据与y轴数据传入
plt.plot(x, y)
# 标题
plt.title('正弦函数')
# 轴标签
plt.xlabel('x')
plt.ylabel('sin(x)')
# 添加网格
plt.grid(True)
# 显示图表
plt.show()

绘制流程:准备数据 -> 选择合适的图表 -> 将数据与图表结合 -> 对图表进行样式设计 -> 展示

基本元素

image-20250514104039650
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建数据
x = np.linspace(0, 10,100)
y = np.sin(x)

# 创建图表
plt.figure(figsize=(10, 6))
plt.plot(x, y, label = "sin(x)")

plt.title("基本图表元素示例", fontsize = 16)
plt.xlabel('X轴', fontsize = 12)
plt.ylabel("Y轴", fontsize = 12)

# 设置坐标轴范围
plt.xlim(0,5)
plt.ylim(-1.5, 1.5)
# linestyle 线形 问AI
plt.grid(True, linestyle="dashdot", alpha = 0.5)

# 设置图例
# loc 定位图例的位置 问AI
plt.legend(loc="upper left")

# 文本注释 x y 文本 字体大小
plt.text(1.5, 1, '峰值', fontsize = 12)

# 箭头: 文本 xy箭头坐标 xytext箭尾坐标(文本坐标) arrowprops箭头的设置
# facecolor 箭头颜色 color 问AI
# shrink 箭头收缩
plt.annotate('最小值',
             xy=(3 * np.pi / 2, -1),
             xytext=(5, -0.5),
             arrowprops=dict(facecolor = '#0F0', shrink = 0.5)
             )

plt.show()

3.常用图表类型

折线图

image-20250514104415116
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 创建数据
x = np.linspace(0,10,100)
y1 = np.sin(x)
y2 = np.cos(x)

# 创建图表
plt.figure(figsize=(10, 6))
# 绘制折线函数
plt.plot(x, y1, label="sin(x)", color='blue', linewidth = 2, linestyle='-')
plt.plot(x, y2, label="cos(x)", color='#F00', linewidth = 2, linestyle='--')

plt.title('折线图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True, linestyle="-.", alpha=0.2)
plt.show()

散点图

用于展示多个变量之间的关系,具体问AI

image-20250514104548638
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
# seed() 随机种子
np.random.seed(42)  # 设置随机种子 保证复现
x = np.random.rand(50)  # 生成0~1之间的随机小数 50个 一维数据
y = np.random.rand(50)  # 生成0~1之间的随机小数 50个 一维数据
sizes = 1000 * np.random.rand(50)  # 每个散点尺寸
colors = np.random.rand(50)  # 随机颜色

# 创建图表
plt.figure(figsize=(10, 6))
"""
c 指定颜色 cmap 默认值 viridis(蓝->黄渐变)
s 指定散点尺寸
cmap 问AI 默认值 viridis 新的值会进行覆盖
"""
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='plasma')

plt.title('散点图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.colorbar(label="颜色值") # 添加颜色条 跟cmap一直
plt.show()

柱状图

image-20250514104647515
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = ['A','B','C','D','E']
y = [25, 40, 30, 55, 15]

# 创建图表
plt.figure(figsize=(10, 6))
plt.bar(x, y, label = "销售数据", color='skyblue', width=0.6)

plt.title('柱状图示例')
plt.xlabel('类别')
plt.ylabel('数值')
plt.legend()
plt.show()

分组柱状图

image-20250514104732835
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
categories = ['A', 'B', 'C', 'D', 'E']
y1 = [25, 40, 30, 55, 15]
y2 = [15, 30, 35, 40, 30]  # Ctrl + Alt + L 整理代码

# 生成与类别数量相等的整数序列
x = np.arange(len(categories))
width = 0.35 # 每一个柱子宽度

# 创建图表
plt.figure(figsize=(12, 6))
plt.bar(x - width / 2, y1, width, label="组1", color="skyblue")
plt.bar(x + width / 2, y2, width, label="组2", color='lightgreen')

# 更改刻度
plt.xticks(x, categories)
plt.title('分组柱状图示例')
plt.xlabel('类别')
plt.ylabel('数值')
plt.legend()
plt.show()

堆叠柱状图

image-20250514104834633
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
categories = ['A', 'B', 'C', 'D', 'E']
y1 = [25, 40, 30, 55, 15]
y2 = [15, 30, 35, 40, 30]  # Ctrl + Alt + L 整理代码

width = 0.35 # 每一个柱子宽度

# 创建图表
plt.figure(figsize=(12, 6))
plt.bar(categories, y1, label="组1", color='#F00', alpha=0.5)
# bottom将组2的底部位置设置为组1的顶部
plt.bar(categories, y2, bottom=y1,label="组2", color='#0F0', alpha=0.5)

plt.title('堆叠柱状图示例')
plt.xlabel('类别')
plt.ylabel('数值')
plt.legend()
plt.show()

水平柱状图

image-20250514104955875
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
categories = ['A', 'B', 'C', 'D', 'E']
y = [25, 40, 30, 55, 15]


# 创建图表
plt.figure(figsize=(12, 6))
plt.barh(categories, y, color='coral')

plt.title('水平柱状图示例')
plt.xlabel('类别')
plt.ylabel('数值')
plt.legend()
plt.show()

直方图

记录数据频次 具体问AI

image-20250514105052664
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
# 生成1000个符合正态分布(高斯分布)的随机数
# loc 均值
# scale 标准差
# size 元素个数
data = np.random.normal(0, 1, 1000)

# 创建图表
plt.figure(figsize=(10, 6))
"""
bins 将数据分成30个区间
edgecolor 边框颜色
"""
plt.hist(data, bins=30, color='skyblue', edgecolor='red', alpha=0.5)

plt.title('直方图示例')
plt.xlabel('值')
plt.ylabel('频数')
plt.grid(True)
plt.show()

多组直方图

image-20250514105205953
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
# 生成1000个符合正态分布(高斯分布)的随机数
# loc 均值
# scale 标准差
# size 元素个数
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(3,1.5, 1000)

# 创建图表
plt.figure(figsize=(10, 6))
plt.hist(data1, bins=30, alpha=0.5, label="数据集1", color='#FF0000') #  RGB RRGGBB
plt.hist(data2, bins=30, alpha=0.5, label="数据集2", color='#0000FF')


plt.title('多组直方图示例')
plt.xlabel('值')
plt.ylabel('频数')
plt.legend()
plt.grid(True)
plt.show()

饼图

image-20250514105259679
# 基本导入
import matplotlib.pyplot as plt
import numpy as np

# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
labels = ['A', 'B', 'C', 'D', 'E']
sizes = [15, 30, 25, 10, 20]
# 各扇形偏移量 为了突出
explode = (0.1, 0, 0, 0, 0)

# 创建图表
plt.figure(figsize=(10, 6))
# autopct 显示百分比
# shadow 设置阴影
# startangle 以某一个角度开始逆时针绘制
plt.pie(sizes, explode=explode, labels=labels, autopct="%.1f%%", shadow=True, startangle=90)

# 其他配置
plt.title('饼图示例')
plt.axis('equal') # 横纵比 问AI
plt.show()

环形图

image-20250514105341115
# 基本导入
import matplotlib.pyplot as plt
import numpy as np

# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
labels = ['A', 'B', 'C', 'D', 'E']
sizes = [15, 30, 25, 10, 20]
# 各扇形偏移量 为了突出
explode = (0.1, 0, 0, 0, 0)

# 创建图表
plt.figure(figsize=(10, 6))
# autopct 显示百分比
# shadow 设置阴影
# startangle 以某一个角度开始逆时针绘制
# webgeprops 设置环形 width以半径的多少比例去抠圆
plt.pie(sizes, explode=explode, labels=labels, autopct="%.1f%%", shadow=True, startangle=90,
        wedgeprops=dict(width=0.8))

# 其他配置
plt.title('饼图示例')
plt.axis('equal') # 横纵比 问AI
plt.show()

箱线图

是一种用于展示数据分布特征的统计图表。它通过绘制数据的分位数、中位数、异常值等关键指标,简洁直观地呈现数据的集中趋势、离散程度、偏态分布等信息

image-20250514105422237
# 基本导入
import matplotlib.pyplot as plt
import numpy as np

# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
labels = ['A','B','C','D','E']
data = [np.random.normal(0,std,100) for std in range(1, 6)]

# 创建图表
plt.figure(figsize=(10,6))
plt.boxplot(data, tick_labels=labels)


# 其他配置
plt.title('箱线图示例')
plt.ylabel('值')
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

小提琴图

是一种用于展示数据分布的统计图表,结合了 箱线图 和 核密度估计 的特点,既能显示数据的整体分布形态(如对称性、峰值、多模态等),又能保留分位数等关键统计量。

image-20250514105525216
# 基本导入
import matplotlib.pyplot as plt
import numpy as np
# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
labels = ['A','B','C','D']
data = [np.random.normal(0,std,100) for std in range(1, 5)]

# 创建图表
plt.figure(figsize=(10,6))
plt.violinplot(data, showmeans=True, showmedians=True)


# 其他配置
plt.title('小提琴图示例')
plt.ylabel('值')
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

面积图

是一种以面积为视觉元素展示数据变化趋势的统计图表,通常由折线图和坐标轴围成的区域填充颜色或图案构成。它不仅能清晰反映数据的增减趋势,还能通过面积大小直观展示数据的累积效应或部分与整体的关系

image-20250514105633507
# 基本导入
import matplotlib.pyplot as plt
import numpy as np

# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.arange(0, 10, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

# 创建图表
plt.figure(figsize=(10, 6))
plt.fill_between(x, y1, alpha=0.5, label="sin(x)" ,color='skyblue')
plt.fill_between(x, y2, alpha=0.5, label="cos(x)",color='green')

# 其他配置
plt.title('面积图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

堆叠面积图

是面积图的一种重要变种,核心特点是将多个数据系列层层堆叠在同一坐标系中,通过总面积和各层面积的变化,直观展示总量与分量的关系、各分量的绝对数值变化以及它们对总量的贡献。它尤其适合分析多变量随时间或类别变化的累积效应

image-20250514105726953
# 基本导入
import matplotlib.pyplot as plt
import numpy as np

# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.arange(0, 10, 0.1)
y1 = x
y2 = x + 2

# 创建图表
plt.figure(figsize=(10, 6))
plt.fill_between(x, 0, y1, alpha=0.5, label="sin(x)", color='skyblue')
plt.fill_between(x, y1, y1 + y2, alpha=0.5, label="cos(x)", color='green')

# 其他配置
plt.title('堆叠面积图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

热力图

是一种通过颜色深浅或明暗变化来直观展示数据分布、密度或相关性的可视化工具。它将数据值映射为颜色矩阵,使复杂的数据模式(如热点区域、异常值、趋势或集群)一目了然

image-20250514105808310
# 基本导入
import matplotlib.pyplot as plt
import numpy as np

# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
# 创建一个100*100的矩阵 数值随机在[0,1)范围内
data = np.random.rand(10,10)

# 创建图表
plt.figure(figsize=(10,10))
# interpolation 颜色插值 nearest默认值 gaussian高斯模糊 问AI
plt.imshow(data, cmap='hot', interpolation="gaussian")

# 其他配置
plt.colorbar(label='值')
plt.title('热力图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.xticks(np.arange(10))
plt.yticks(np.arange(10))
plt.show()

等高线图

是一种用于可视化二维标量场数据的图表,通过绘制一系列等值线(等高线)来展示数据的分布、变化趋势和空间关系。

image-20250514105858397
# 基本导入
import matplotlib.pyplot as plt
import numpy as np

# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
# 将x-y一维数据组成一个平面的二维数据
X, Y = np.meshgrid(x, y)
# 计算网格点的高度值
Z = np.sin(X) * np.cos(Y)

# 创建图表
plt.figure(figsize=(10,8))
# contour 等高线图表对象
contour = plt.contour(X,Y,Z,20,cmap='hot')

# 添加等高线
# inline=True 将标签放在等高线上
plt.clabel(contour, inline=True, fontsize=8)

# 其他配置
plt.colorbar(label='高度')
plt.title('等高线示例图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.grid(True)
plt.show()

3D图表

image-20250514110109511
# 基本导入
import matplotlib.pyplot as plt
import numpy as np
# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
# 墨西哥草帽函数曲面
Z = np.sin(np.sqrt(X ** 2 + Y ** 2))

# 创建图表
fig = plt.figure(figsize=(12, 8))

# 创建一个3D坐标系的子图
# 111 nrows=1 ncols=1 index = 1 简写 创建一个1×1的子图网格 将其放在第1个位置
# projection="3d" 表示3D子图
ax = fig.add_subplot(111, projection="3d")

# 在子图中进行绘制墨西哥草帽的曲面
# edgecolor 不显示网格
surf = ax.plot_surface(X,Y,Z, cmap='hot', edgecolor='none')

"""
shrink 将颜色条进行缩小50%
aspect 设置颜色条宽高比 5
"""
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=5, label='高度')

# 其他配置
ax.set_title('3D曲面图示例')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
plt.show()

极坐标图

是一种用极坐标系展示数据的图表类型,适合呈现与角度和 距离(半径)相关的规律,例如周期性变化、方向分布、径向数据对比等。它通过极径(半径)和极角(角度)两个变量来定位数据点,将平面划分为不同角度的扇形区域,用半径长度表示数据大小。

image-20250514110158508
# 基本导入
import matplotlib.pyplot as plt
import numpy as np
# 中文与负号设置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
# 极角数据
theta = np.linspace(0, 2 * np.pi, 500)
# 极径数据
r = np.abs(np.sin(5 * theta) * np.cos(2*theta))

# 创建图表
plt.figure(figsize=(8,8))
# 创建一个极坐标的子图 projection 确定图表的投影类型 3d polar 默认笛卡尔坐标系
ax = plt.subplot(111, projection='polar')
ax.plot(theta, r)

# 其他配置
plt.title('极坐标图示例')
plt.show()

4.图表美化与样式设置

线条颜色和样式

image-20250514110309054
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.cos(x)

# 创建图表
plt.figure(figsize=(12, 6))
plt.plot(x, y1, 'b-', label='sin(x)', linewidth = 2)
plt.plot(x, y2, 'r--', label='cos(x)', linewidth = 2)
# marker = 'o'  圆形标记
# markevery = 10 每10个点显示一个标记
# markersize = 8 标记的大小 8pt
plt.plot(x, y3, 'g-.', label = 'sin(x)cos(x)', linewidth = 2, marker = "o",
         markevery = 10, markersize = 8)

# 其他设置
plt.title("线条样式示例")
plt.xlabel("X轴")
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)
plt.show()

自定义颜色映射

image-20250514110413532
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# x 1 2 3 4 5 6 7 8 9 ........
# y 0 1 2 3 2 1 0 -1 -2 -3 -2 -1 0 1 2 3 2 1 0 ......
colors = x

# 创建图表
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=colors, cmap = "hot",s=100, alpha=0.7)
plt.colorbar(label="X值")

# 其他设置
plt.title("自定义颜色映射示例")
plt.xlabel("X轴")
plt.ylabel('Y轴')
plt.grid(True)
plt.show()

image-20250514112059921

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)

# 创建自定义颜色映射
colors = [(0, 'black'), (0.3, 'yellow'), (0.5, 'red'), (0.7, 'green'), (1, 'blue')]
from matplotlib.colors import LinearSegmentedColormap
cmap_name = 'MyColorsMap'
# 返回的是自定义的颜色映射对象 线性变化的映射 (名字,颜色映射列表)
custom_cmap = LinearSegmentedColormap.from_list(cmap_name, colors)

# 创建图表
plt.figure(figsize=(10, 8))
plt.contour(X, Y, Z, 20, cmap=custom_cmap)
plt.colorbar(label="Z值")

# 其他设置
plt.title("自定义颜色映射示例")
plt.xlabel("X轴")
plt.ylabel('Y轴')
plt.show()

添加图例

image-20250514110834720
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.linspace(0,10,100)
y1 = np.sin(x)
y2 = np.cos(x)

# 创建图表
plt.figure(figsize=(10,6))
plt.plot(x, y1, 'b-', label='sin(x)')
plt.plot(x, y2, 'r--', label='cos(x)')


# 其他设置
plt.title("添加图例示例")
# frameon 控制是否显示图例的边框 默认打开
# facecolor 图例的背景颜色
# edgecolor 图例的边框颜色
plt.legend(loc="lower left", fontsize=18, frameon=True,
           facecolor = 'lightgray', edgecolor='red')
plt.xlabel("X轴")
plt.ylabel('Y轴')
plt.show()

自定义刻度

image-20250514110906917
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 创建图表
plt.figure(figsize=(10, 6))
plt.plot(x, y1, 'b-', label='sin(x)')
plt.plot(x, y2, 'r--', label='cos(x)')

# 其他设置
plt.title("添加图例示例")
# frameon 控制是否显示图例的边框 默认打开
# facecolor 图例的背景颜色
# edgecolor 图例的边框颜色
plt.legend(loc="lower left", fontsize=18, frameon=True,
           facecolor='lightgray', edgecolor='red')
plt.xlabel("X轴")
plt.ylabel('Y轴')
# 更改X轴刻度
plt.xticks([0, np.pi / 2, np.pi, 3 * np.pi / 2, 2 * np.pi], ['0', 'π/2', 'π', '3π/2', '2π'])
# 更改Y轴刻度
plt.yticks([-1, 0, 1], ['最小值', "零值", "最大值"])
plt.grid(True)
plt.show()

双Y轴图表

image-20250514110946766
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = x ** 2

# 创建图表
fig, ax1 = plt.subplots(figsize=(10, 6))

# 第一个子图中 创建第一个Y轴
ax1.set_xlabel("X轴")
ax1.set_ylabel("sin(x)", color="red")
ax1.plot(x, y1, color='red')
# 修改Y轴的颜色
ax1.tick_params(axis='y', labelcolor='red')

# 第二个子图中 创建第二个Y轴
ax2 = ax1.twinx() # 创建与ax1子图共享X轴的次坐标轴 子图
ax2.set_ylabel('x^2', color='blue')
ax2.plot(x, y2, color='blue')
# 修改Y轴的颜色
ax2.tick_params(axis='y', labelcolor='blue')

# 其他设置
plt.title("双Y轴图例示例")

# 自动调整布局,避免元素重叠 问AI
fig.tight_layout()

plt.show()

5.多子图与布局

基本子图

image-20250514111125171
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

plt.figure(figsize=(12,8))

# 把整个图标分成2×2的网格状 在第1个位置上 绘制一个子图
"""
1 2
3 4
"""
plt.subplot(2,2,1)
plt.plot(np.random.rand(10))
plt.title("子图1")

plt.subplot(2,2,2)
plt.scatter(np.random.rand(10),np.random.rand(10),)
plt.title("子图2")

plt.subplot(2,2,3)
plt.bar(range(5),np.random.rand(5))
plt.title("子图3")

plt.subplot(2,2,4)
plt.hist(np.random.randn(1000), bins=20)
plt.title("子图4")

plt.tight_layout()
plt.show()

使用 plt.subplots

image-20250514111218115
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# fig 整个图标
# axs 子图的二维数组
fig, axs = plt.subplots(2, 2, figsize=(12, 8))

axs[0, 0].plot(np.random.rand(10))
axs[0, 0].set_title('子图1')

axs[0, 1].scatter(np.random.rand(10),np.random.rand(10))
axs[0, 1].set_title('子图2')

axs[1, 0].bar(range(5),np.random.rand(5))
axs[1, 0].set_title('子图3')

axs[1, 1].hist(np.random.randn(1000), bins=20)
axs[1, 1].set_title('子图4')

plt.tight_layout()
plt.show()

不规则子图布局

image-20250514111329122
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 可以对图表进行网格状划分 同时也支持行或者列合并
import matplotlib.gridspec as gridspec

plt.figure(figsize = (12, 8))
gs = gridspec.GridSpec(3,3)

ax1 = plt.subplot(gs[0, :]) # 第一行全部
ax2 = plt.subplot(gs[1, :-1]) # 第二行 除了最后一列
ax3 = plt.subplot(gs[1:, -1]) # 最后一列的第二行和第三行
ax4 = plt.subplot(gs[2, 0]) # 第三行 第一列
ax5 = plt.subplot(gs[2, 1]) # 第三行 第二列

ax1.plot(np.random.rand(10))
ax1.set_title("子图1")

ax2.plot(np.random.rand(10))
ax2.set_title("子图2")

ax3.plot(np.random.rand(10))
ax3.set_title("子图3")

ax4.plot(np.random.rand(10))
ax4.set_title("子图4")

ax5.plot(np.random.rand(10))
ax5.set_title("子图5")

plt.tight_layout()
plt.show()

子图共享轴

image-20250514111429157
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建共享X轴的子图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10,8), sharex=True)

x = np.linspace(0, 10, 100)
ax1.plot(x, np.sin(x))
ax1.set_title("sin(x)")

ax2.plot(x, np.cos(x), color='red')
ax2.set_title("cos(x)")
ax2.set_xlabel('X轴')

plt.tight_layout()
plt.show()

6.交互式绘图

简单交互

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 默认是一个1×1的网格
fig, ax = plt.subplots(figsize=(10,6))
x = np.linspace(0,10,100)
y = np.sin(x)

ax.plot(x,y)
ax.grid(True)
ax.set_title("测试")

# 定义一个当鼠标移动时事件处理函数
# event用于接受具体是哪一个事件类型
def on_motion(event) :
    # 判断事件的发生地点是否在子图上
    if event.inaxes == ax:
        # 将数据填入在子图的标题中
        ax.set_title(f'鼠标位置:x={event.xdata:.2f}, y={event.ydata:.2f}')
        # 重新绘制子图
        fig.canvas.draw_idle()

# 存储标记的点
points = []
# 存储标记的文本
texts = []

# 定义一个当鼠标点击时事件处理函数
def on_click(event):
    if event.inaxes != ax:
        return
    if event.button == 1: # 鼠标左键
        # 绘制的一个点(一个列表 由多组数据组成的)
        point = ax.plot(event.xdata, event.ydata, 'ro', markersize = 8)
        points.append(point)
        # 文本内容 中心坐标 文本偏移 (x轴偏移,y偏移) 水平方向上的对齐方式
        text = ax.annotate(f'({event.xdata:.2f},{event.ydata:.2f})',
                           (event.xdata, event.ydata),
                           textcoords='offset points',
                           xytext=(0, 10),
                           ha = "center")
        texts.append(text)
        fig.canvas.draw_idle()
    elif event.button == 3: # 鼠标右键
        # 如果没有任何点 则不删除
        if (len(points) <= 0):
            return
        for item in points[-1]:
            # 把最后一个点的所有数据清空 从子图中擦除
            item.remove()
        points.pop() # 移除点的数据

        texts[-1].remove()
        texts.pop()
        fig.canvas.draw_idle()

# 给图标设置对应的事件
# 设置鼠标移动事件(事件名称, 处理函数) 具体AI
fig.canvas.mpl_connect('motion_notify_event', on_motion)
# 设置鼠标点击事件(事件名称, 处理函数)
fig.canvas.mpl_connect('button_press_event', on_click)
# 键盘事件 问AI

plt.show()

保存图片

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 可以对图表进行网格状划分 同时也支持行或者列合并
import matplotlib.gridspec as gridspec

plt.figure(figsize = (12, 8))
gs = gridspec.GridSpec(3,3)

ax1 = plt.subplot(gs[0, :]) # 第一行全部
ax2 = plt.subplot(gs[1, :-1]) # 第二行 除了最后一列
ax3 = plt.subplot(gs[1:, -1]) # 最后一列的第二行和第三行
ax4 = plt.subplot(gs[2, 0]) # 第三行 第一列
ax5 = plt.subplot(gs[2, 1]) # 第三行 第二列

ax1.plot(np.random.rand(10))
ax1.set_title("子图1")

ax2.plot(np.random.rand(10))
ax2.set_title("子图2")

ax3.plot(np.random.rand(10))
ax3.set_title("子图3")

ax4.plot(np.random.rand(10))
ax4.set_title("子图4")

ax5.plot(np.random.rand(10))
ax5.set_title("子图5")

plt.tight_layout()

# 保存图片的函数
plt.savefig("图1.png", dpi=300, bbox_inches = "tight")
plt.savefig("图1.pdf", bbox_inches = "tight")
plt.savefig("图1.svg", bbox_inches = "tight")

plt.show()

7.进阶技巧

自定义绘制函数

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def plot_function(func, x_range, title, color='blue', linestyle='-'):
    """
    绘制函数图像的通用函数
    参数:
    func: 要绘制的函数
    x_range: x轴范围,格式为(start, end, num_points)
    title: 图表标题
    color: 线条颜色
    linestyle: 线条样式
    """
    x = np.linspace(x_range[0], x_range[1], x_range[2])
    y = func(x)

    plt.figure(figsize=(10, 6))
    plt.plot(x, y, color=color, linestyle=linestyle)
    plt.title(title)
    plt.xlabel('X轴')
    plt.ylabel('Y轴')
    plt.grid(True)
    # 绘制水平参考线
    plt.axhline(y=0, color='black', linestyle='-', alpha=0.3)
    # 绘制垂直参考线
    plt.axvline(x=0, color='black', linestyle='-', alpha=0.3)

    return plt

# 使用自定义函数绘制不同函数
plot_function(np.sin, (-2 * np.pi, 2 * np.pi, 100), '正弦函数', 'red', '-')
plt.show()

plot_function(lambda x: x ** 2, (-5, 5, 100), '二次函数', 'green', '--')
plt.show()

plot_function(lambda x: np.exp(x), (-2, 2, 100), '指数函数', 'blue', '-.')
plt.show()

添加水印

image-20250514112203061

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y)
plt.title('带水印的图表')
plt.xlabel('X轴')
plt.ylabel('Y轴')

# 添加水印
plt.figtext(0.5, 0.5, 'WATERMARK', fontsize=40, color='gray',
            ha='center', va='center', alpha=0.3, rotation=30)

plt.grid(True)
plt.show()

误差棒

image-20250514112526219

import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号


# 创建数据
x = np.arange(1, 6)
y = np.array([1, 4, 3, 5, 2])
error = np.array([0.2, 0.5, 0.4, 0.7, 0.3])

plt.figure(figsize=(10, 6))
"""
x, y:数据点的坐标
yerr=error:Y 方向的误差范围
fmt='o-':标记样式(圆形)和连接线样式(实线)
capsize=5:误差棒顶部横线的长度(单位:点)
capthick=1:误差棒顶部横线的粗细
ecolor='red':误差棒的颜色
markeredgecolor='blue':标记点的边缘颜色
label='数据点':图例标签
"""
plt.errorbar(x, y, yerr=error, fmt='o-', capsize=5, capthick=1,
             ecolor='red', markeredgecolor='blue', label='数据点')

plt.title('误差棒示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)
plt.show()

填充区域

image-20250514112609060

import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号


x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.sin(x) + 0.5

plt.figure(figsize=(10, 6))
plt.plot(x, y1, 'b-', label='sin(x)')
plt.plot(x, y2, 'r-', label='sin(x) + 0.5')

# 填充两条曲线之间的区域
plt.fill_between(x, y1, y2, color='lightblue', alpha=0.5, label='填充区域')

plt.title('填充区域示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)
plt.show()

绘制表格

image-20250514112702447

import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号

# 创建数据
data = np.random.rand(5, 4)
rows = ['A', 'B', 'C', 'D', 'E']
columns = ['类别1', '类别2', '类别3', '类别4']

plt.figure(figsize=(10, 6))
plt.axis('off')  # 关闭坐标轴

# 创建表格
table = plt.table(cellText=np.round(data, 2),
                  rowLabels=rows,# 可删除
                  colLabels=columns,
                  cellLoc='center',
                  loc='center',
                  colWidths=[0.2] * 4)

table.auto_set_font_size(False)
table.set_fontsize(12)
table.scale(1.2, 1.5)  # 调整表格大小

plt.title('表格示例', y=0.8)
plt.show()

绘制雷达图

image-20250514112808548
import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号


# 创建数据
categories = ['类别A', '类别B', '类别C', '类别D', '类别E', '类别F']
values = [4, 3, 5, 2, 4, 5]

# 计算角度
N = len(categories)
# 生成从 0 到 2π 的 N 个等分角度(不包含终点 2π)
# endpoint=False 确保 6 个类别均匀分布在 360 度圆周上(每个间隔 60 度)
angles = np.linspace(0, 2*np.pi, N, endpoint=False).tolist()
# 将第一个值追加到列表末尾,使图形首尾相连形成闭合环
values += values[:1]  # 闭合雷达图
angles += angles[:1]

# 绘制雷达图
plt.figure(figsize=(8, 8))
# polar=True 指定使用极坐标系统绘图
ax = plt.subplot(111, polar=True)
ax.plot(angles, values, 'o-', linewidth=2)
ax.fill(angles, values, alpha=0.25)

# 设置刻度标签
# set_thetagrids 将弧度转换为角度,并设置各个类别的标签位置
ax.set_thetagrids(np.degrees(angles[:-1]), categories)

# 设置雷达图的范围
# et_ylim 设置径向轴的范围(0-6),确保数据点有足够空间展示
ax.set_ylim(0, 6)

plt.title('雷达图示例')
plt.show()

8.案例:数据分析可视化

image-20250514122803398

import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号


# 生成模拟数据
np.random.seed(42)
years = np.arange(2010, 2023)
sales_a = np.random.randint(100, 200, size=len(years)) + np.arange(len(years)) * 5
sales_b = np.random.randint(80, 150, size=len(years)) + np.arange(len(years)) * 3
profit_margin = np.random.uniform(0.1, 0.3, size=len(years))

# 创建多子图
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(12, 15), sharex=True)

# 第一个子图:销售额折线图
ax1.plot(years, sales_a, 'o-', color='blue', linewidth=2, label='产品A')
ax1.plot(years, sales_b, 's--', color='red', linewidth=2, label='产品B')
ax1.set_title('年度销售额趋势', fontsize=14)
ax1.set_ylabel('销售额 (万元)', fontsize=12)
ax1.grid(True, linestyle='--', alpha=0.7)
ax1.legend()

# 第二个子图:销售额差异柱状图
ax2.bar(years, sales_a - sales_b, color='purple')
ax2.axhline(y=0, color='black', linestyle='-', alpha=0.3)
ax2.set_title('产品A与产品B销售额差异', fontsize=14)
ax2.set_ylabel('差异 (万元)', fontsize=12)
ax2.grid(True, linestyle='--', alpha=0.7)

# 第三个子图:利润率散点图
scatter = ax3.scatter(years, profit_margin, c=profit_margin, s=profit_margin*500,
                     cmap='viridis', alpha=0.7)
ax3.set_title('年度利润率', fontsize=14)
ax3.set_xlabel('年份', fontsize=12)
ax3.set_ylabel('利润率', fontsize=12)
ax3.grid(True, linestyle='--', alpha=0.7)
plt.colorbar(scatter, ax=ax3, label='利润率')

plt.tight_layout()
plt.show()

9.案例:股票数据可视化

image-20250514122905742

import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号

import matplotlib.dates as mdates
from datetime import datetime, timedelta

# 生成模拟股票数据
np.random.seed(42)
start_date = datetime(2022, 1, 1)
dates = [start_date + timedelta(days=i) for i in range(100)]
price = 100 + np.cumsum(np.random.normal(0, 1, 100))
volume = np.random.randint(1000, 5000, 100)

# 创建图表
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True,
                              gridspec_kw={'height_ratios': [3, 1]})

# 绘制股票价格
ax1.plot(dates, price, 'b-', linewidth=1.5)
ax1.set_title('股票价格与交易量', fontsize=16)
ax1.set_ylabel('价格', fontsize=12)
ax1.grid(True, linestyle='--', alpha=0.7)

# 添加移动平均线
window = 5
ma = np.convolve(price, np.ones(window)/window, mode='valid')
ma_dates = dates[window-1:]
ax1.plot(ma_dates, ma, 'r-', linewidth=1.5, label=f'{window}日移动平均线')
ax1.legend()

# 绘制交易量
ax2.bar(dates, volume, color='g', alpha=0.5)
ax2.set_ylabel('交易量', fontsize=12)
ax2.set_xlabel('日期', fontsize=12)
ax2.grid(True, linestyle='--', alpha=0.7)

# 格式化日期
date_format = mdates.DateFormatter('%Y-%m-%d')
ax2.xaxis.set_major_formatter(date_format)
ax2.xaxis.set_major_locator(mdates.WeekdayLocator(interval=2))
plt.xticks(rotation=45)

plt.tight_layout()
plt.show()

10.案例:科学数据可视化

image-20250514123025110

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建数据
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z1 = np.sin(np.sqrt(X**2 + Y**2))
Z2 = np.cos(np.sqrt(X**2 + Y**2))

# 创建图表
fig = plt.figure(figsize=(15, 10))

# 3D曲面图
ax1 = fig.add_subplot(221, projection='3d')
surf1 = ax1.plot_surface(X, Y, Z1, cmap='viridis', edgecolor='none', alpha=0.8)
ax1.set_title('3D曲面图 - sin(r)')
ax1.set_xlabel('X轴')
ax1.set_ylabel('Y轴')
ax1.set_zlabel('Z轴')

# 等高线图
ax2 = fig.add_subplot(222)
contour = ax2.contourf(X, Y, Z1, 20, cmap='viridis')
plt.colorbar(contour, ax=ax2, label='高度')
ax2.set_title('等高线图 - sin(r)')
ax2.set_xlabel('X轴')
ax2.set_ylabel('Y轴')

# 3D曲面图 - 第二个函数
ax3 = fig.add_subplot(223, projection='3d')
surf2 = ax3.plot_surface(X, Y, Z2, cmap='plasma', edgecolor='none', alpha=0.8)
ax3.set_title('3D曲面图 - cos(r)')
ax3.set_xlabel('X轴')
ax3.set_ylabel('Y轴')
ax3.set_zlabel('Z轴')

# 等高线图 - 第二个函数
ax4 = fig.add_subplot(224)
contour = ax4.contourf(X, Y, Z2, 20, cmap='plasma')
plt.colorbar(contour, ax=ax4, label='高度')
ax4.set_title('等高线图 - cos(r)')
ax4.set_xlabel('X轴')
ax4.set_ylabel('Y轴')

plt.tight_layout()
plt.show()

11.案例:多变量数据可视化

image-20250514123116133

import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号


from matplotlib.gridspec import GridSpec

# 生成多变量数据
np.random.seed(42)
n_samples = 100
var1 = np.random.normal(0, 1, n_samples)
var2 = var1 * 0.5 + np.random.normal(0, 0.5, n_samples)
var3 = var1 * -0.7 + var2 * 0.3 + np.random.normal(0, 0.3, n_samples)
var4 = var2 * 0.8 + np.random.normal(0, 0.4, n_samples)

data = np.column_stack((var1, var2, var3, var4))
variables = ['变量1', '变量2', '变量3', '变量4']

# 创建散点图矩阵
fig = plt.figure(figsize=(12, 10))
gs = GridSpec(4, 4)

for i in range(4):
    for j in range(4):
        ax = fig.add_subplot(gs[i, j])

        # 对角线上绘制直方图
        if i == j:
            ax.hist(data[:, i], bins=15, color='skyblue', edgecolor='black', alpha=0.7)
            ax.set_title(variables[i])
        # 非对角线上绘制散点图
        else:
            ax.scatter(data[:, j], data[:, i], alpha=0.5)

        # 只在最左侧和最底部显示坐标轴标签
        if j == 0:
            ax.set_ylabel(variables[i])
        else:
            ax.set_yticks([])

        if i == 3:
            ax.set_xlabel(variables[j])
        else:
            ax.set_xticks([])

plt.suptitle('多变量数据可视化', fontsize=16)
plt.tight_layout(rect=[0, 0, 1, 0.97])
plt.show()

12.案例:时间序列数据可视化

image-20250514123235305

import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号


import matplotlib.dates as mdates
from datetime import datetime, timedelta

# 生成时间序列数据
np.random.seed(42)
start_date = datetime(2022, 1, 1)
dates = [start_date + timedelta(days=i) for i in range(365)]
temp = 20 + 10 * np.sin(np.arange(365) * 2 * np.pi / 365) + np.random.normal(0, 2, 365)
precip = np.random.exponential(5, 365) * (1 + 0.5 * np.sin(np.arange(365) * 2 * np.pi / 365))

# 创建图表
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)

# 绘制温度曲线
ax1.plot(dates, temp, 'r-', linewidth=1, alpha=0.7)
ax1.set_ylabel('温度 (°C)', fontsize=12)
ax1.set_title('全年温度和降水量', fontsize=16)
ax1.grid(True, linestyle='--', alpha=0.7)

# 计算并绘制移动平均线
window = 30
temp_ma = np.convolve(temp, np.ones(window)/window, mode='valid')
ma_dates = dates[window-1:]
ax1.plot(ma_dates, temp_ma, 'b-', linewidth=2, label=f'{window}天移动平均')
ax1.legend()

# 绘制降水量柱状图
ax2.bar(dates, precip, color='skyblue', alpha=0.7, width=1)
ax2.set_ylabel('降水量 (mm)', fontsize=12)
ax2.set_xlabel('日期', fontsize=12)
ax2.grid(True, linestyle='--', alpha=0.7)

# 格式化日期
date_format = mdates.DateFormatter('%Y-%m')
ax2.xaxis.set_major_formatter(date_format)
ax2.xaxis.set_major_locator(mdates.MonthLocator())

plt.tight_layout()
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值