Matplotlib 零基础入门总结
Matplotlib 是 Python 中最常用的开源绘图库,能画折线图、柱状图、散点图等多种 2D 图形,操作简单且文档完善,不管是 Python 工程师、科研学者还是数据工程师都经常用它。下面从基础准备、核心绘图知识、图形美化、组合与子图、规范绘图及标注这几个方面,帮零基础小白快速掌握它。
一、基础准备:环境与模块导入
在开始绘图前,需要先做好环境配置和模块导入,这是后续绘图的前提。
1. 环境配置(关键命令)
- Notebook 环境(如 Jupyter Notebook) :必须先运行魔术命令
%matplotlib inline
,作用是把绘制的图形直接嵌入到当前页面,方便查看。 - 桌面环境 :不需要上面的命令,只需在所有绘图代码写完后,加一句
plt.show()
,就能弹出窗口显示图形。
2. 模块导入(固定写法)
Matplotlib 绘图主要依赖pyplot
模块,约定俗成简称为plt
,导入代码如下:
python
from matplotlib import pyplot as plt
后续很多绘图操作,都是通过plt.xxx
(xxx 是具体方法)来实现的。
二、核心绘图:常见 2D 图形怎么画
pyplot
模块里有各种绘图方法,不同方法对应不同图形,掌握这些基础图形的绘制,就能应对大部分简单需求。
1. 折线图(最基础)
-
方法 :
plt.plot()
-
核心逻辑 :默认只传一个列表时,列表作为
y
值,x
值从 0 开始自动递增;若要自定义x
值,传两个列表(第一个x
、第二个y
)。 -
示例代码 :
python# 1. 只传y值,x默认0、1、2... plt.plot([1,2,3,2,1,2,3,4,5,6,5,4,3,2,1]) # 画"山峰"折线图 # 2. 传x和y,自定义x从2开始 plt.plot([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16], # x值 [1,2,3,2,1,2,3,4,5,6,5,4,3,2,1]) # y值 # 3. 画正弦曲线(结合numpy生成连续数据) import numpy as np # 先导入数值计算库numpy X = np.linspace(-2*np.pi, 2*np.pi, 1000) # -2π到2π间生成1000个均匀点(x轴) y = np.sin(X) # 计算y值(正弦值) plt.plot(X, y) # 画正弦曲线(看起来是曲线,实际是密集点连的直线)
2. 其他常用图形(方法 + 示例)
除了折线图,柱状图、散点图等也很常用,核心是换plt
后的方法名,数据传入逻辑和折线图类似。
图形类型 | 方法 | 核心作用 | 示例代码 |
---|---|---|---|
柱状图 | plt.bar() |
展示不同类别数据的大小对比 | plt.bar([1,2,3], [1,2,3]) (x 为 1、2、3,对应 y 为 1、2、3 的柱子) |
散点图 | plt.scatter() |
展示两个变量的分布关系(如 GPS 经纬度) | X=np.random.ranf(1000); y=np.random.ranf(1000); plt.scatter(X,y) (1000 个随机散点) |
饼状图 | plt.pie() |
展示各部分占总体的比例 | plt.pie([1,2,3,4,5]) (5 部分,比例 1:2:3:4:5) |
量场图 | plt.quiver() |
展示向量方向(如气象风场) | X,y=np.mgrid[0:10,0:10]; plt.quiver(X,y) (10x10 网格的箭头) |
等高线图 | plt.contourf() |
展示三维数据的二维等高线(如地形) | 见下文代码 |
等高线图示例代码(稍复杂,需生成网格数据):
python
x = np.linspace(-5,5,500) # x轴500个点
y = np.linspace(-5,5,500) # y轴500个点
X, Y = np.meshgrid(x, y) # 生成500x500的网格矩阵
Z = (1 - X/2 + X**3 + Y**4) * np.exp(-X**2 - Y**2) # 计算等高线值
plt.contourf(X, Y, Z) # 画等高线图
三、图形美化:让图更 "好看"
默认画的图比较朴素,通过plt.xxx
方法的关键字参数(kwargs) ,可以调整颜色、线型、大小等样式,让图形更清晰、美观。
1. 折线图美化(常用参数)
plt.plot()
有很多美化参数,核心是在括号里加参数名=值
。
python
# 示例:画两条美化后的三角函数曲线
X = np.linspace(-2*np.pi, 2*np.pi, 1000)
y1 = np.sin(X) # 正弦
y2 = np.cos(X) # 余弦
# 正弦曲线:红色(color='r')、虚线(linestyle='--')、线宽2(linewidth=2)、透明度0.8(alpha=0.8)
plt.plot(X, y1, color='r', linestyle='--', linewidth=2, alpha=0.8)
# 余弦曲线:蓝色(color='b')、实线(linestyle='-')、线宽2
plt.plot(X, y2, color='b', linestyle='-', linewidth=2)
2. 散点图美化(常用参数)
plt.scatter()
的美化参数侧重散点的大小、颜色等:
python
x = np.random.rand(100) # 100个随机x
y = np.random.rand(100) # 100个随机y
colors = np.random.rand(100) # 100个随机颜色(渐变)
size = np.random.normal(50, 60, 100) # 100个随机大小(均值50,标准差60)
# s=散点大小,c=散点颜色
plt.scatter(x, y, s=size, c=colors)
3. 饼状图美化(常用参数)
plt.pie()
可以加标签、阴影、偏移等,让比例更易读:
python
label = ['Cat','Dog','Cattle','Sheep','Horse'] # 类别标签
color = ['r','g','r','g','y'] # 每个类别的颜色
size = [1,2,3,4,5] # 每个类别的占比数据
explode = (0,0,0,0,0.2) # 最后一个类别(Horse)向外偏移0.2(突出显示)
# autopct='%1.1f%%':显示百分比(保留1位小数);shadow=True:加阴影
plt.pie(size, colors=color, explode=explode, labels=label, shadow=True, autopct='%1.1f%%')
plt.axis('equal') # 让饼状图呈正圆形(否则可能是椭圆)
四、组合图与子图:多图一起展示
实际需求中,常需要把多个图形放在一起(如折线图 + 柱状图),或把多个独立图按顺序排列(子图),核心是 "共享坐标" 或 "管理画布"。
1. 组合图(同一坐标下多图)
只要多个图形的横坐标相同,把绘图代码写在一起,Matplotlib 会自动叠加显示:
python
x = [1,3,5,7,9,11,13,15,17,19] # 共享x轴
y_bar = [3,4,6,8,9,10,9,11,7,8] # 柱状图的y
y_line = [2,3,5,7,8,9,8,10,6,7] # 折线图的y
plt.bar(x, y_bar) # 先画柱状图
plt.plot(x, y_line, '-o', color='y') # 再画折线图(-o:带圆点标记,黄色)
2. 子图(多图按行列排列)
用plt.subplots(nrows=行数, ncols=列数)
创建子图,再逐个绘制,适合展示多个独立图形。
python
x = np.linspace(0,10,20) # 通用x数据
y = x*x + 2 # 通用y数据
# 1. 1行2列的子图(nrows=1, ncols=2)
fig, axes = plt.subplots(nrows=1, ncols=2) # fig=画板,axes=两个子图的画布列表
axes[0].plot(x, y, 'r') # 第一个子图(索引0):红色曲线
axes[1].plot(y, x, 'g') # 第二个子图(索引1):绿色曲线(x和y互换)
# 2. 调整子图尺寸和精度(figsize=宽高,dpi=清晰度)
fig, axes = plt.subplots(nrows=1, ncols=4, figsize=(16,5)) # 1行4列,宽16高5
n = np.array([0,1,2,3,4,5])
axes[0].scatter(x, x+0.25*np.random.randn(len(x))) # 子图1:散点图
axes[1].step(n, n**2, lw=2) # 子图2:梯步图
axes[2].bar(n, n**2, align="center", width=0.5, alpha=0.5) # 子图3:柱状图
axes[3].fill_between(x, x**2, x**3, color="green", alpha=0.5) # 子图4:面积图
3. 大图套小图(自定义画布位置)
用fig.add_axes([左, 下, 宽, 高])
控制画布位置,实现 "大画布 + 小画布" 效果:
python
x = np.linspace(0,10,20)
y = x*x + 2
fig = plt.figure() # 新建画板
axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 大画布:左0.1、下0.1、宽0.8、高0.8
axes2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # 小画布:左0.2、下0.5、宽0.4、高0.3
axes1.plot(x, y, 'r') # 大画布画红色曲线
axes2.plot(y, x, 'g') # 小画布画绿色曲线(x和y互换)
五、规范绘图:加标题、图例、网格等
专业的图需要清晰的标注,比如标题、坐标轴名称、图例等,通过axes
对象的方法可以添加这些元素,让图更易理解。
1. 加标题、坐标轴名称、图例
python
x = np.linspace(0,10,20)
fig, axes = plt.subplots()
# 1. 坐标轴名称(xlabel、ylabel)
axes.set_xlabel('x label') # x轴名称
axes.set_ylabel('y label') # y轴名称
# 2. 图形标题(title)
axes.set_title('Title: y = x² and y = x³')
# 3. 画两条曲线
axes.plot(x, x**2) # 第一条:y=x²
axes.plot(x, x**3) # 第二条:y=x³
# 4. 图例(legend):说明每条线代表什么
# loc=0:自适应位置;loc=1~4:分别是右上、左上、左下、右下
axes.legend(["y = x²", "y = x³"], loc=0)
2. 加网格、调整坐标轴范围
python
x = np.linspace(0,10,20)
fig, axes = plt.subplots(1,2, figsize=(10,5)) # 1行2列子图,宽10高5
# 子图1:显示网格(grid=True)
axes[0].plot(x, x**2, x, x**3, lw=2) # 画两条线(线宽2)
axes[0].grid(True) # 显示网格
# 子图2:调整坐标轴范围(xlim、ylim)
axes[1].plot(x, x**2, x, x**3)
axes[1].set_ylim([0,60]) # y轴范围:0~60
axes[1].set_xlim([2,5]) # x轴范围:2~5
六、图像标注:加文字、箭头
复杂图形需要额外标注(如突出最小值、解释特殊点),用plt.text()
加文字,plt.annotate()
加箭头。
1. 文字标注(plt.text ())
在柱状图上标注具体数值,核心是确定标注的位置(x、y)和文字内容:
python
fig, axes = plt.subplots()
x_bar = [10,20,30,40,50] # 柱状图x坐标
y_bar = [0.5,0.6,0.3,0.4,0.8] # 柱状图y坐标(柱子高度)
bars = axes.bar(x_bar, y_bar, color='blue', width=2) # 画柱状图
# 遍历每个柱子,加文字标注
for i, rect in enumerate(bars):
x_text = rect.get_x() # 获取柱子的x坐标(左边缘)
y_text = rect.get_height() + 0.01 # 文字y坐标:柱子高度+0.01(避免和柱子重叠)
plt.text(x_text, y_text, '%.1f' % y_bar[i]) # 标注文字(保留1位小数)
2. 箭头标注(plt.annotate ())
在文字标注基础上,加箭头指向特殊点(如最小值):
python
fig, axes = plt.subplots()
bars = axes.bar(x_bar, y_bar, color='blue', width=2)
# 先加文字标注(同上面代码)
for i, rect in enumerate(bars):
x_text = rect.get_x()
y_text = rect.get_height() + 0.01
plt.text(x_text, y_text, '%.1f' % y_bar[i])
# 加箭头标注:指向"最小值"(y=0.3,x=30)
# xy:箭头终点(指向的点);xytext:箭头起点(文字位置)
# arrowprops:箭头样式(facecolor=颜色,width=箭尾宽,headwidth=箭头宽)
plt.annotate('Min', xy=(32, 0.3), xytext=(36, 0.3),
arrowprops=dict(facecolor='black', width=1, headwidth=7))
总结:零基础绘图流程
- 准备 :Notebook 环境用
%matplotlib inline
,导入plt
和numpy
(如需数据); - 选图形 :确定画折线图(
plt.plot
)、柱状图(plt.bar
)等,准备 x、y 数据; - 美化 :加
color
、linewidth
等参数调整样式; - 规范标注 :加标题、图例、网格(用
axes.set_xxx
); - 展示 :桌面环境加
plt.show()
,Notebook 不用。