【Python系列课程】22 Matplotlib(一):绘图基础与常用图表——让数据"看得见"

> 数据分析的最后一公里是可视化。一行好的图表胜过一千行统计数字。Matplotlib是Python最经典的可视化库,语法风格和MATLAB如出一辙,被Seaborn、Pandas绘图等高级库大量依赖。本篇从零开始,带你搭建绘图环境,学会折线图、散点图、条形图这三大常用图表。

一、Matplotlib 是什么?为什么要学它?

Matplotlib 是 Python 最经典的2D绘图库,诞生于2003年,至今仍是Python数据可视化生态的基石。

| 库 | 定位 | 和Matplotlib的关系 |
|
|

|

-|
| Matplotlib | 底层绘图引擎 | — |
| Seaborn | 统计可视化(更美观) | 基于Matplotlib |
| Pandas.plot() | 快速探索式绘图 | 调用Matplotlib |
| Plotly | 交互式Web图表 | 独立体系 |

为什么还要学Matplotlib?
- 极致可控:你可以控制图表的每一个像素
- 生态基础:Seaborn、Pandas绘图都是它的封装
- 文档丰富:遇到任何可视化问题,都能找到Matplotlib解决方案

二、环境准备:导入 + 中文支持

2.1 基础导入

`python
import matplotlib.pyplot as plt
import numpy as np
`

plt 是约定俗成的别名,几乎所有Matplotlib代码都以 plt. 开头。

2.2 中文显示问题的解决(重要!)

Matplotlib默认不支持中文,画出来的图里中文会变成方框或乱码。解决方法只有两行代码:

`python
import matplotlib.pyplot as plt

指定中文字体(SimHei = 黑体)


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

解决负号 '-' 显示为方块的问题


plt.rcParams['axes.unicode_minus'] = False
`

> [图1:中文显示问题对比图——左边未设置rcParams显示为方框,右边设置后正常显示]

可选字体列表(如果SimHei不可用):

| 字体名 | 说明 | 系统 |
|

--|

|

|
| 'SimHei' | 黑体 | Windows/Mac |
| 'Microsoft YaHei' | 微软雅黑 | Windows |
| 'STSong' | 宋体 | Mac |
| 'Arial Unicode MS' | 通用Unicode字体 | Mac |
| 'WenQuanYi Micro Hei' | 文泉驿微米黑 | Linux |

> 把这两行代码放在所有plt代码的最前面,后面的图就都不会乱码了。

三、折线图:plt.plot() —— 最基础的图表

3.1 最简单的折线图

`python
import matplotlib.pyplot as plt
import numpy as np

准备数据


x = np.linspace(-3, 3, 50) # 从-3到3,生成50个等间隔点
y = np.sin(x) # sin曲线

plt.plot(x, y) # 画图
plt.show() # 显示图像
`

> [图2:sin(x)折线图——最简单的默认样式输出]

3.2 plot() 的常用参数

`python
plt.plot(x, y,
color='skyblue', # 线条颜色
linestyle='-.', # 线条样式
linewidth=2, # 线条宽度(数字越大越粗)
marker='h', # 数据点标记样式
markerfacecolor='gold', # 标记填充色
markersize=8, # 标记大小
label='sin曲线') # 图例标签(下一篇讲)
`

> [图3:带样式的折线图——展示color、linestyle、marker等参数的效果]

3.3 颜色(color)参数速查

颜色可以用英文名十六进制

| 常用颜色名 | 十六进制 | 效果 |
|

--|

|

|
| 'red' | '#FF0000' | 红色 |
| 'blue' | '#0000FF' | 蓝色 |
| 'green' | '#008000' | 绿色 |
| 'gold' | '#FFD700' | 金色 |
| 'skyblue' | '#87CEEB' | 天蓝 |
| 'orange' | '#FFA500' | 橙色 |
| 'black' | '#000000' | 黑色 |
| 'gray' | '#808080' | 灰色 |

3.4 线条样式(linestyle)

| 样式代码 | 完整名称 | 效果 |
|

|

|

|
| '-' | 'solid' | 实线(默认) |
| '--' | 'dashed' | 虚线 |
| '-.' | 'dashdot' | 点画线 |
| ':' | 'dotted' | 点线 |
| '' | 'None' | 不显示线条 |

3.5 标记样式(marker)

| 标记代码 | 说明 | 标记代码 | 说明 |
|

|

|

|

|
| 'o' | 实心圆 | 's' | 实心方形 |
| '^' | 上三角 | 'v' | 倒三角 |
| '<' | 左三角 | '>' | 右三角 |
| '+' | 十字 | 'x' | X标记 |
| '*' | 星形 | 'D' | 菱形 |
| '.' | 点标记 | 'h' | 竖六边形 |

3.6 同一张图画多条线

`python
x = np.linspace(-3, 3, 50)
y1 = 2*x + 2 # 直线
y2 = x**2 # 抛物线
y3 = np.sin(x) # 正弦曲线

plt.plot(x, y1, color='gold', label='直线')
plt.plot(x, y2, color='red', label='抛物线')
plt.plot(x, y3, color='green', label='正弦曲线')
plt.legend() # 显示图例
plt.show()
`

> [图4:同一画布上三条曲线的叠加效果——用不同颜色区分]

四、画布(Figure)的创建:隐式 vs 显式

4.1 隐式创建(最简单)

当你第一次调用 plt.plot() 时,Matplotlib会自动创建一个画布和坐标系:

`python

什么都不用做,plot()会自动创建画布


plt.plot(x, y1, color='gold')
plt.plot(x, y2, color='red')
plt.show()
`

4.2 显式创建:plt.figure() —— 创建多个画布

当你需要多个独立的窗口时,用 plt.figure() 显式创建:

`python
x = np.linspace(-3, 3, 50)
y1 = 2*x + 2
y2 = x**2
y3 = np.sin(x)

画布1:画两条线


plt.figure() # 创建画布1
plt.plot(x, y1, color='gold')
plt.plot(x, y2, color='red')

画布2:画另一条线


plt.figure() # 创建画布2
plt.plot(x, y3, color='green')

plt.show() # 显示两个画布窗口
`

> [图5:两个独立画布的窗口截图——展示两个figure()创建的独立窗口]

4.3 figure() 的常用参数

`python
plt.figure(
num=3, # 画布编号(数字)或名称(字符串)
figsize=(7, 3), # 宽7英寸,高3英寸
dpi=72, # 分辨率(72是屏幕标准,300是打印标准)
facecolor='red' # 画布背景色
)
`

| 参数 | 默认值 | 说明 |
|

|

--|

|
| num | 自动递增数字 | 画布编号,可指定字符串名称 |
| figsize | (6.4, 4.8) | 宽和高,单位是英寸 |
| dpi | 100 | 每英寸像素数,越大越清晰 |
| facecolor | 'white' | 画布背景颜色 |

五、散点图:plt.scatter()

散点图用来观察两个变量之间的关系(如身高和体重的相关性)。

5.1 基础散点图

`python
import matplotlib.pyplot as plt
import numpy as np

生成两组正态分布的随机数据


x1 = np.random.normal(0, 1, 100)
y1 = np.random.normal(0, 1, 100)
x2 = np.random.normal(0, 1, 100)
y2 = np.random.normal(0, 1, 100)

plt.scatter(x1, y1)
plt.scatter(x2, y2)
plt.show()
`

5.2 scatter() 的常用参数

`python
plt.scatter(x1, y1,
s=90, # 点的大小
c='green', # 点的颜色
marker='D', # 点的标记样式
alpha=0.5, # 透明度(0=完全透明,1=不透明)
linewidths=2, # 边框线宽度
edgecolors='red') # 边框线颜色
`

> [图6:带样式的散点图——展示两组数据点,用不同颜色和透明度区分]

5.3 实际应用:模拟两组学生的身高体重

`python

男生组(偏大)


male_height = np.random.normal(175, 5, 50)
male_weight = np.random.normal(70, 8, 50)

女生组(偏小)


female_height = np.random.normal(160, 5, 50)
female_weight = np.random.normal(50, 5, 50)

plt.scatter(male_height, male_weight,
s=80, c='blue', marker='o', alpha=0.6,
label='男生')
plt.scatter(female_height, female_weight,
s=80, c='red', marker='^', alpha=0.6,
label='女生')
plt.xlabel('身高 (cm)')
plt.ylabel('体重 (kg)')
plt.legend()
plt.title('学生身高-体重散点图')
plt.show()
`

> [图7:男女生身高-体重散点图——蓝色圆圈(男)和红色三角(女)分布在不同的区域]

六、条形图:plt.bar()

条形图用来比较不同类别的数值大小

6.1 基础条形图

`python
import matplotlib.pyplot as plt
import numpy as np

准备数据


x = np.arange(1, 11) # 1到10,代表10个类别
h = np.random.randint(20, 35, 10) # 随机生成10个高度值

plt.bar(x, h)
plt.show()
`

6.2 bar() 的常用参数

`python
plt.bar(x, h,
width=0.6, # 条形宽度(默认0.8)
color='skyblue', # 填充颜色
edgecolor='black', # 边框颜色
alpha=0.8, # 透明度
linewidth=1, # 边框线宽
bottom=0.5, # 底边起始位置
align='center') # 对齐方式:'center'(居中)或 'edge'(边缘)
`

6.3 正负双色条形图

`python
x = np.arange(1, 11)
h1 = np.random.randint(20, 35, 10)
h2 = np.random.randint(15, 40, 10)

上面一组(正值),下面一组(负值)


plt.bar(x, +h1, color='skyblue', label='A组')
plt.bar(x, -h2, color='salmon', label='B组')

在每个条形上方标注数值


for i in range(len(x)):
plt.text(x[i], h1[i] + 0.5, str(h1[i]), ha='center', fontsize=9)
plt.text(x[i], -h2[i] - 0.5, str(h2[i]), ha='center', fontsize=9)

plt.legend()
plt.show()
`

> [图8:正负双色条形图——A组朝上蓝色,B组朝下红色,每个条形上标注了数值]

6.4 并排条形图

`python
x = np.arange(1, 6) # 5个类别
width = 0.35 # 每个条形的宽度
h1 = [25, 30, 28, 35, 32]
h2 = [20, 22, 25, 30, 28]

两组条形并排:一组在x-width/2处,一组在x+width/2处


plt.bar(x - width/2, h1, width, color='skyblue', label='A组')
plt.bar(x + width/2, h2, width, color='salmon', label='B组')
plt.xticks(x, ['周一', '周二', '周三', '周四', '周五'])
plt.legend()
plt.show()
`

> [图9:并排条形图——蓝色和红色条形分别代表两组,在x轴标签的两侧排列]

七、图像显示:plt.imshow()

imshow() 可以将二维数据渲染成图像:

`python
import matplotlib.pyplot as plt
import numpy as np

plt.figure()

创建一个3x3的灰度数据


data = np.array([[0, 50, 200],
[200, 100, 0],
[0, 150, 200]])

plt.imshow(data)
plt.colorbar() # 添加颜色条
plt.show()

使用灰度色彩映射


plt.figure()
plt.imshow(data, cmap='Greys', alpha=0.8)
plt.colorbar()
plt.show()
`

> [图10:imshow生成的图像——左边是默认彩色,右边是灰度模式]

八、常用图表选择指南

| 图表类型 | 函数 | 适用场景 | 示例 |
|

|

|

|

|
| 折线图 | plt.plot() | 趋势变化、连续数据 | 股票价格走势、温度变化 |
| 散点图 | plt.scatter() | 变量关系、分布模式 | 身高vs体重、广告费vs销售额 |
| 条形图 | plt.bar() | 类别对比 | 各产品销量、各省GDP |
| 直方图 | plt.hist() | 数据分布 | 学生成绩分布、用户年龄分布 |
| 饼图 | plt.pie() | 占比关系 | 市场份额、预算分配 |
| 热力图 | plt.imshow() | 矩阵数据可视化 | 相关性矩阵、图像数据 |

九、本文总结

| 知识点 | 核心要点 |
|

--|

|
| 导入 | import matplotlib.pyplot as plt |
| 中文乱码 | plt.rcParams['font.sans-serif'] = ['SimHei'] |
| 画布 | 隐式(自动创建)或显式 plt.figure() |
| 折线图 | plt.plot(x, y, color, linestyle, linewidth, marker, label) |
| 散点图 | plt.scatter(x, y, s, c, marker, alpha, edgecolors) |
| 条形图 | plt.bar(x, h, width, color, edgecolor, align) |
| 显示图像 | plt.show() |

记忆口诀:画图三步走——准备数据 → 调用绘图函数 → plt.show()

动手练习

1. 用 np.linspace() 生成-π到π的100个点,分别画出sin、cos、tan的折线图(三条线画在同一张图上,用不同颜色区分)。

2. 生成两组各100个正态分布随机点(不同均值和标准差),画一张散点图,设置不同颜色和标记样式。

3. 创建一个条形图,展示"水果"(苹果、香蕉、橙子、葡萄、西瓜)和对应的销量(自己编5个数字),要求:设置条形颜色为'orange',边框为黑色,宽度0.6,在每个条形上方标注销量数字。

4. 用 np.random.randint(0, 256, (100, 100, 3)) 生成一个随机彩色图像,用 plt.imshow() 显示它。
下一篇预告:《23 Matplotlib(二):坐标轴定制、图例与文字标注》

posted @ 2026-06-27 08:45  AI视界尼奥  阅读(12)  评论(0)    收藏  举报