news 2026/5/1 4:07:03

【数据处理与统计分析】9.Matplotlib绘图讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【数据处理与统计分析】9.Matplotlib绘图讲解

一、Matplotlib快速入门

目标

  • 了解什么是matplotlib

  • 为什么要学习matplotlib

  • matplotlib简单图形的绘制

1、什么是Matplotlib

  • 是专门用于开发2D图表(包括3D图表)

  • 以渐进、交互式方式实现数据可视化

2、为什么要学习Matplotlib

可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法。

  • 能将数据进行可视化,更直观的呈现

  • 使数据更加客观、更具说服力

例如下面两个图为数字展示和图形展示:

3、实现一个简单的Matplotlib画图 — 以折线图为例

3.1 matplotlib.pyplot模块

matplotlib.pytplot包含了一系列类似于matlab的画图函数。

import matplotlib.pyplot as plt

3.2 图形绘制流程:

  • 1.创建画布--plt.figure()

  • plt.figure(figsize=(), dpi=) figsize:指定图的长宽 dpi:图像的清晰度 返回fig对象
  • 2.绘制图像 -- plt.plot(x, y)

    • 以折线图为例
  • 3.显示图像 -- plt.show()

3.3 折线图绘制与显示

举例:展现上海一周的天气,比如从星期一到星期日的天气温度如下

# 导包 import matplotlib.pyplot as plt import random import numpy as np # 解决中文乱码问题. 思路1: 本机(或者虚拟机)安装SimHei字体. 思路2: 导包, 配置字体. # 设置显示中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置正常显示符号 plt.rcParams['axes.unicode_minus'] = False # matplotlib绘图的基本步骤: # 1. 创建画布. # 2. 准备数据集, x轴, y轴. # 可选: 颜色, 线型, 线宽, 标签, 网格, 图例, 标题, 坐标轴标签. # 3. 绘制图像. # 1. 创建画布. # figsize: 宽, 高, dpi: 分辨率(默认是: 100), 越高, 画布越清晰. # 下述画布像素为: 10 * 80, 5 * 80 -> 800, 400 plt.figure(figsize=(10, 5), dpi=80) # 2. 准备数据集, x轴, y轴. x = [1, 2, 3, 4, 5, 6, 7] #x轴 y = [6, 2, 10, 14, 21, 5, 30] # y轴: 温度. plt.plot(x, y) # plot() -> 绘制 折线图. # 3.展示 plt.show()

4、认识Matplotlib图像结构

二、Matplotlib基础绘图功能

目标

  • 掌握给图形添加辅助功能(如:标注、x,y轴名称、标题等)

  • 知道图形的保存

  • 知道如何多次plot绘制图形

  • 知道如何多个坐标系显示图形

  • 知道折线图的应用场景

1、完善原始折线图 — 给图形添加辅助功能

为了更好地理解所有基础绘图功能,通过天气温度变化的绘图来融合所有的基础API使用

需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度

1.1 准备数据并画出初始折线图

# 1. 准备数据. # x轴 -> 分钟, 一共 60个值. x = range(60) # print(x) # y轴 -> 温度, 范围: 15 ~ 18, 随机生成. y = [random.uniform(5, 18) for i in x] # print(y) # 2. 创建画布. plt.figure(figsize=(20, 8), dpi=80) # 3. 绘制图形. plt.plot(x, y) # 4. 给图标添加辅助功能. # 4.1 添加自定义x,y刻度 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. # 4.3 设置标题 和 x, y轴的 标签. # 5. 保存图形, 细节: plt.show()之后会释放画布资源, 所以要在 plt.show()之前调用, 用于保存图片, 否则图片就是空白的. # 6.显示图形. plt.show()

作用:返回一个随机的浮点数,其值在区间[a, b]之间(包括ab)。

分布:数值在指定区间内是均匀分布的,这意味着每个数值出现的概率是相等的。

1.2 添加自定义x,y刻度

  • plt.xticks(x, **kwargs)

    x:要显示的刻度值

  • plt.yticks(y, **kwargs)

    y:要显示的刻度值

#完善如下代码: # 4. 给图标添加辅助功能. # 4.1 添加自定义x,y刻度 x_ticks_label = [f'11点{i}分' for i in x] # x的范围: [0, 60), x轴的: 刻度标签. # print(x_ticks_label) y_ticks_label = [i for i in range(0, 20)] # print(y_ticks_label) # 具体的设置刻度的操作. #[::5] 为了好看, 间隔设置 plt.xticks(x[::5], x_ticks_label[::5]) # 0 -> '11点0分', 1 -> '11点1分', 2 -> '11点2分'...... plt.yticks(y_ticks_label[::5]) # 0, 1, 2, 3, 4, 5...39

效果如下:

如果没有解决过中文问题的话,会显示这个样子:

1.3 中文显示问题解决

解决方案一:

下载中文字体(黑体,看准系统版本)

  • 步骤一:下载 SimHei 字体(或者其他的支持中文显示的字体也行)

  • 步骤二:安装字体

    • linux下:拷贝字体到 usr/share/fonts 下:

      sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf
    • windows和mac下:双击安装

  • 步骤三:删除~/.matplotlib中的缓存文件

    cd ~/.matplotlib rm -r *
  • 步骤四:修改配置文件matplotlibrc

    vi ~/.matplotlib/matplotlibrc

    将文件内容修改为:

    font.family : sans-serif font.sans-serif : SimHei axes.unicode_minus : False

解决方案二:

在Python脚本中动态设置matplotlibrc,这样也可以避免由于更改配置文件而造成的麻烦,具体代码如下:

from pylab import mpl # 设置显示中文字体 mpl.rcParams["font.sans-serif"] = ["SimHei"]

有时候,字体更改后,会导致坐标轴中的部分字符无法正常显示,此时需要更改axes.unicode_minus参数:

# 设置正常显示符号 mpl.rcParams["axes.unicode_minus"] = False

解决方案三:

# 解决中文显示问题,下面的代码只需运行一次即可 import matplotlib as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False

1.4 添加网格显示&设置标题, x,y轴标签

为了更加清楚地观察图形对应的值:

plt.grid(True, linestyle='--', alpha=0.5)

设置标签:

plt.xlabel("x轴标签")
plt.ylabel("y轴标签")
plt.title("标题", fontsize=20) #fontsize 文字大小

#完善上面代码 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. plt.grid(True, linestyle='-', alpha=0.5) # 4.3 设置标题 和 x, y轴的 标签. plt.xlabel('时间', fontsize=15) plt.ylabel('温度', fontsize=20) plt.title('成都市11点到12点1小时的温度变化', fontsize=20)

1.5 图片保存

# 5. 保存图形, 细节: plt.show()之后会释放画布资源, 所以要在 plt.show()之前调用, 用于保存图片, 否则图片就是空白的. plt.savefig('./my.jpg')

1.6 完整代码

# 1. 准备数据. # x轴 -> 分钟, 一共 60个值. x = range(60) # print(x) # y轴 -> 温度, 范围: 15 ~ 18, 随机生成. y = [random.uniform(5, 18) for i in x] # print(y) # 2. 创建画布. plt.figure(figsize=(20, 8), dpi=80) # 3. 绘制图形. plt.plot(x, y) # 导包 import matplotlib.pyplot as plt import random import numpy as np # 解决中文乱码问题. 思路1: 本机(或者虚拟机)安装SimHei字体. 思路2: 导包, 配置字体. # 设置显示中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置正常显示符号 plt.rcParams['axes.unicode_minus'] = False # matplotlib绘图的基本步骤: # 1. 创建画布. # 2. 准备数据集, x轴, y轴. # 可选: 颜色, 线型, 线宽, 标签, 网格, 图例, 标题, 坐标轴标签. # 3. 绘制图像. # 4. 给图标添加辅助功能. # 4.1 添加自定义x,y刻度 x_ticks_label = [f'11点{i}分' for i in x] # x的范围: [0, 60), x轴的: 刻度标签. # print(x_ticks_label) y_ticks_label = [i for i in range(0, 20)] # print(y_ticks_label) # 具体的设置刻度的操作. #[::5] 为了好看, 间隔设置 plt.xticks(x[::5], x_ticks_label[::5]) # 0 -> '11点0分', 1 -> '11点1分', 2 -> '11点2分'...... plt.yticks(y_ticks_label[::5]) # 0, 1, 2, 3, 4, 5...39 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. plt.grid(True, linestyle='-', alpha=0.5) # 4.3 设置标题 和 x, y轴的 标签. plt.xlabel('时间', fontsize=15) plt.ylabel('温度', fontsize=20) plt.title('成都市11点到12点1小时的温度变化', fontsize=20) # 5. 保存图形, 细节: plt.show()之后会释放画布资源, 所以要在 plt.show()之前调用, 用于保存图片, 否则图片就是空白的. plt.savefig('./my.jpg') # 6.显示图形. plt.show()

2、在一个坐标系中绘制多个图像(多次plot)

需求:再添加一个城市的温度变化

收集到其他城市当天温度变化情况,温度在3度到15度。怎么去添加另一个在同一坐标系当中的不同图形,其实很简单只需要再次plot即可,但是需要区分线条,如下显示:

仔细观察,用到了两个新的地方,一个是对于不同的折线展示效果,一个是添加图例

设置图形风格

eg:

# 3. 绘制图形. plt.plot(x, y_cd, label='成都', color='r') # label -> 图例标签 显示的值, color -> 颜色 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. plt.grid(True, linestyle='--', alpha=0.5)
颜色字符风格字符
r 红色- 实线
g 绿色- - 虚线
b 蓝色-. 点划线
w 白色: 点虚线
c 青色' ' 留空、空格
m 洋红
y 黄色
k 黑色

显示图例:

注意:如果只在plt.plot()中设置label还不能最终显示出图例,还需要通过plt.legend()将图例显示出来,eg:

# 4.4 显示图例. # 参1: 图例标签, 参2: 图例的位置. # plt.legend(['成都', '黑龙江'], loc='best') # Location Code -> 图例的位置的值. # 参2: 绘图时如果指定了图例值, 则图例标签可以省略. plt.legend(loc=1) # loc: 图例显示位置 plt.legend(loc='best') # 效果同上.

legend里面的loc参数参考值如下:

Location StringLocation Code
'best'0
'upper right'1
'upper left'2
'lower left'3
'lower right'4
'right'5
'center left'6
'center right'7
'lower center'8
'upper center'9
'center'10

完整代码:

# 需求: 画出成都, 黑龙江, 11点到12点1小时内每分钟的温度变化折线图, 温度范围在: 1 ~ 10 # 1. 准备数据. # x轴 -> 分钟, 一共 60个值. x = range(60) # y轴 -> 温度, 范围: 15 ~ 18, 随机生成. y_cd = [random.uniform(1, 15) for i in x] # y轴 -> 成都. y_hlj = [random.uniform(-20, 3) for i in x] # y轴 -> 黑龙江. # 2. 创建画布. plt.figure(figsize=(20, 5), dpi=80) # 3. 绘制图形. plt.plot(x, y_cd, label='成都', color='r') # label -> 图例标签 显示的值, color -> 颜色 plt.plot(x, y_hlj, label='黑龙江', color='b') # 4. 给图标添加辅助功能. # 4.1 添加自定义x,y刻度 x_ticks_label = [f'11点{i}分' for i in x] # x的范围: [0, 60), x轴的: 刻度标签. y_ticks_label = [i for i in range(-30, 20)] # 具体的设置刻度的操作. [::5]: 表示获取所有数据, 步长为5 显示 plt.xticks(x[::5], x_ticks_label[::5]) # 0 -> '11点0分', 1 -> '11点1分', 2 -> '11点2分'...... plt.yticks(y_ticks_label[::5]) # -30, -29, ...20 # 4.2 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. plt.grid(True, linestyle='--', alpha=0.5) # 4.3 设置标题 和 x, y轴的 标签. plt.xlabel('时间', fontsize=15) plt.ylabel('温度', fontsize=15) plt.title('成功/黑龙江 11点到12点1小时的温度变化', fontsize=20) # 4.4 显示图例. # 参1: 图例标签, 参2: 图例的位置. # plt.legend(['成都', '黑龙江'], loc='best') # Location Code -> 图例的位置的值. # 参2: 绘图时如果指定了图例值, 则图例标签可以省略. plt.legend(loc=1) # loc: 图例显示位置 plt.legend(loc='best') # 效果同上. # 5. 保存图形, 细节: plt.show()之后会释放画布资源, 所以要在 plt.show()之前调用, 用于保存图片, 否则图片就是空白的. plt.savefig('./my2.jpg') # 6.显示图形. plt.show()

效果图如下:

3.多个坐标系显示— plt.subplots(面向对象的画图方法)

如果想要将成都和重庆的天气图显示在同一个图的不同坐标系当中,效果如下:

可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数:

  • matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 创建一个带有多个axes(坐标系/绘图区)的图
Parameters: nrows, ncols : 设置有几行几列坐标系 int, optional, default: 1, Number of rows/columns of the subplot grid. Returns: fig : 图对象 axes : 返回相应数量的坐标系 设置标题等方法不同: set_xticks set_yticks set_xlabel set_ylabel
  • 关于axes子坐标系的更多方法:参考https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes
  • 注意:plt.函数名()相当于面向过程的画图方法,ax.set_方法名()相当于面向对象的画图方法。
  • 代码如下:
# 需求: 画出成都, 黑龙江, 11点到12点1小时内每分钟的温度变化折线图, 温度范围在: 1 ~ 10 # 1. 准备数据. x轴 -> 时间, y轴 -> 温度. x = range(60) y_cd = [random.uniform(-3, 15) for i in x] # 成都温度 y_hlj = [random.uniform(-20, 10) for i in x] # 黑龙江温度 # 2. 创建画布. # plt.figure(figsize=(20, 8), dpi=80) # 面向过程版, 即: 所有的函数都是 plt. 的方式调用的. # 面向对象版绘图, fig -> 画布(1行2列的画布), ax -> 坐标系 plg, ax = plt.subplots(figsize=(20, 8), nrows=1, ncols=2) # 3. 具体的绘制图像的动作.color: 线的颜色, label: 标签名称, linstyle: 线的格式 # ax[0] -> 坐标系的0行0列 ax[0].plot(x, y_cd, color='r', label='成都') # ax[1] -> 坐标系的0行1列 ax[1].plot(x, y_hlj, color='y', label='黑龙江', linestyle='--') # 4. 添加刻度 # 4.1 定义变量, 表示: x轴, y轴刻度的范围. x_ticks_label = [f'11点{i}分' for i in x] y_ticks = [i for i in range(-30, 20)] # 4.2 具体的添加刻度的操作. ax[0].set_xticks(x[::5]) # 图1的: x轴的刻度值 ax[0].set_yticks(y_ticks[::5]) # 图1的: y轴的刻度值 ax[0].set_xticklabels(x_ticks_label[::5]) # 图1的: x轴的(刻度)标签值 ax[1].set_xticks(x[::5]) # 图2的: x轴的刻度值 ax[1].set_yticks(y_ticks[::5]) # 图2的: y轴的刻度值 ax[1].set_xticklabels(x_ticks_label[::5]) # 图2的: x轴的(刻度)标签值 # 5. 设置标题 和 x, y轴标签. ax[0].set_xlabel('温度', fontsize=15) ax[0].set_ylabel('湿度', fontsize=15) ax[0].set_title('成都11点到12点1小时的温度变化', fontsize=20) ax[1].set_xlabel('温度', fontsize=15) ax[1].set_ylabel('湿度', fontsize=15) ax[1].set_title('重庆11点到12点1小时的温度变化', fontsize=20) # 6. 添加网格. # 参1: 网格线是否显示. True -> 显示, False -> 不显示. # 参2: linestyle: 网格线类型, '-' -> 实线, '--' -> 虚线, ':' -> 点线, '-.' -> 虚点线 # 参3: 透明度. ax[0].grid(True, linestyle='--', alpha=0.5) ax[1].grid(True, linestyle='-.', alpha=0.5) # 7. 添加图例. ax[0].legend(loc='best') ax[1].legend(loc=0) # 效果同上, 0 -> base, 自动匹配最佳位置. # 8. 保存图片. plt.savefig('./my.jpg') # 9. 显示图像. plt.show()

4.绘制 数学-数字关系图

import numpy as np # 1.准备数据 x = np.linspace(-10, 10, 500) y = np.sin(x) # 1.创建画布 plt.figure(figsize=(20, 8), dpi=90) # 2.绘制函数图像 plt.plot(x, y) # 2.1 添加网格显示 plt.grid() # 3.显示图像 plt.show()

应用场景:

  • 呈现公司产品(不同区域)每天活跃用户数

  • 呈现app每天下载数量

  • 呈现产品新功能上线后,用户点击次数随时间的变化

  • 拓展:画各种数学函数图像

    • 注意:plt.plot()除了可以画折线图,也可以用于画各种数学函数图像

三、常见图形绘制

1、官方案例库

https://matplotlib.org/stable/gallery/index.html

2、常见图形种类及意义

  • 常见图形绘制如下:折线图( plot() ), 柱状图( bar() ), 直方图( hist() ) 饼图( pie() ), 散点图( scatter() )......
  • Matplotlib官方绘图网址 参考:https://matplotlib.org/stable/gallery/index.html

2.1 折线图

  • 折线图:以折线的上升或下降来表示统计数量的增减变化的统计图

    特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)

    api:plt.plot(x, y)

2.2 柱形图

柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。

特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)

api:plt.bar(x, width, align='center', **kwargs)

Parameters: x : 需要传递的数据 width : 柱状图的宽度 align : 每个柱状图的位置对齐方式 {'center', 'edge'}, optional, default: 'center' **kwargs : color:选择柱状图的颜色

# 绘制 柱形图. # 1. 准备数据. x = ['A', 'B', 'C', 'D', 'E'] y = [3, 6, 1, 8, 2] # 创建画布, 如果不写, 系统会默认创建1个画布. # plt.figure(figsize=(20, 8)) # 2. 绘制柱状图. plt.bar(x, y, color='r') # 3. 设置x轴, y轴标签 和 标题. plt.xlabel('分类名') plt.ylabel('商品个数') plt.title('商品分类统计图', fontsize=15) # 4. 显示图像. plt.show()

2.3 直方图

由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。

特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)

api:matplotlib.pyplot.hist(x, bins=None)

Parameters: x : 需要传递的数据 bins : 组距

# 绘制 直方图 -> 适用于 统计分析, 查看(每组)数据的分布情况. # 直方图原理: 相当于把 原数据分成 长度为 区间数 + 1的等差数列, 每两个值 = 1个区间. # 柱状图: 展示 单个分类 的值的分布情况. # 直方图: 展示 区间值 的分布情况. # 1. 准备数据. data = np.random.randint(0, 150, 100) # data # 100个 0 ~ 150 之间的随机整数. # 回顾: 等差数列, 0 ~ 150之间, 11个数. # print(np.linspace(0, 150, 11)) # [0. 15. 30. 45. 60. 75. 90. 105. 120. 135. 150.] # 2. 创建画板. plt.figure(figsize=(20, 8)) # 3. 绘制图形. # 参1: 绘制的数据. # 参2: 直方图的分段数量(即: 几个区间). # 参3: 颜色, # 参4: 透明度, 参5: 柱子的宽度. plt.hist(data, bins=10, color='b', alpha=0.5, rwidth=0.85) # 4. 设置 x轴, y轴标签 和 标题. plt.xlabel('商品价格区间') plt.ylabel('商品个数') plt.title('商品价格区间分布图', fontsize=15) # 5. 显示图形. plt.show()

2.4 饼图

  • 饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。

    特点:分类数据的占比情况(占比)

    api:plt.pie(x, labels=,autopct=,colors)

    Parameters: x:数量,自动算百分比 labels:每部分名称 autopct:占比显示指定%1.2f%% colors:每部分颜色

# 绘制 饼图, 每个分类的占比情况. # 1. 参数1: 绘制的数据. 参数2: 饼图的标签. sizes = [25, 35, 25, 15] labels = ['电脑', '手机', '键盘', '鼠标'] # 2. 具体的绘图动作. # 参1: 绘制的数据. # 参2: 饼图的标签. # 参3: 显示百分比, %% 表示 1个 % plt.pie(sizes, labels=labels, autopct='%1.1f%%') # 绘制饼图,显示百分比 plt.title("Simple Pie Chart") # 设置图表标题 # 3. 显示图形. plt.show() # 显示图表

2.5 散点图

散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。

特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

api:plt.scatter(x, y)

# 散点图, 适用于 散点分析, 即: 两个值之间的关系. x = [1, 2, 3, 4, 5] y = [2, 3, 5, 7, 11] # scatter(), 散点图. plt.scatter(x, y, color='red') # 绘制红色散点图 plt.title("Simple Scatter Plot") # 设置图表标题 plt.xlabel("X-axis") # 设置X轴标签 plt.ylabel("Y-axis") # 设置Y轴标签 plt.show() # 显示图表

【上一篇】【数据处理与统计分析】8.Pandas高级处理:缺失值判断&数据合并

【下一篇】【数据处理与统计分析】10.RFM会员价值度模型案例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 8:03:20

数据库系统工程师-事务核心原理与 ACID 特性详解

一、引言1.1 事务的核心定义事务是数据库系统中由一系列读写操作组成的不可分割的逻辑工作单元,核心执行原则是 "要么全部执行成功,要么全部不执行",是数据库保障数据一致性的基础机制。1.2 软考考点定位事务相关知识点属于软考数据…

作者头像 李华
网站建设 2026/4/28 6:10:28

如何快速掌握PCL启动器:面向Minecraft新手的完整教程

如何快速掌握PCL启动器:面向Minecraft新手的完整教程 【免费下载链接】PCL Minecraft 启动器 Plain Craft Launcher(PCL)。 项目地址: https://gitcode.com/gh_mirrors/pc/PCL Plain Craft Launcher(简称PCL)是…

作者头像 李华