Matplotlib plot() 函数
plot() 是 Matplotlib 中最核心的函数,用于绘制折线图。
它通过连接给定的 x 和 y 坐标点来创建线条,支持自定义颜色、线型、标记和线宽。
函数定义
pyplot 接口
matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
Axes 接口
Axes.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| *args | 可变参数 | 支持多种调用方式:plot(y)、plot(x, y)、plot(x, y, 'fmt')、plot(x1, y1, 'fmt1', x2, y2, 'fmt2', ...) |
| scalex / scaley | bool | 是否自动缩放 x/y 轴以适应数据,默认为 True |
| data | 可索引对象 | 若提供,则可以用字符串作为参数引用其中的数据列 |
| color 或 c | color | 线条颜色,如 'red'、'#ff0000'、'tab:blue' |
| linestyle 或 ls | str | 线型:'-'(实线)、'--'(虚线)、'-.'(点划线)、':'(点线)、''(无线条) |
| linewidth 或 lw | float | 线宽,默认约 1.5 |
| marker | str | 数据点标记:'.'、'o'、's'、'^'、'*'、'+'(加号)、'x' 等 |
| markersize 或 ms | float | 标记大小 |
| label | str | 图例标签,配合 legend() 使用 |
| alpha | float | 透明度,0(完全透明)到 1(完全不透明) |
| zorder | float | 图层顺序,数值越大越靠上 |
fmt 格式字符串由三部分组成:
'[颜色][标记][线型]',如'ro--'表示红色、圆点标记、虚线。各部分顺序可任意排列。
常用颜色简写
| 字符 | 颜色 | 字符 | 颜色 |
|---|---|---|---|
| 'b' | 蓝色 blue | 'r' | 红色 red |
| 'g' | 绿色 green | 'c' | 青色 cyan |
| 'm' | 品红 magenta | 'y' | 黄色 yellow |
| 'k' | 黑色 black | 'w' | 白色 white |
使用示例
示例 1:最简单的折线图
只传入 y 值,x 自动使用从 0 开始的索引。
实例
import matplotlib.pyplot as plt
import numpy as np
# 生成 0-10 之间的 50 个数据点
x = np.linspace(0, 10, 50)
y = np.sin(x) # 正弦函数
# 最简单的调用:x, y
plt.plot(x, y)
plt.title('Simple Line Plot')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True, alpha=0.3)
plt.show()
import numpy as np
# 生成 0-10 之间的 50 个数据点
x = np.linspace(0, 10, 50)
y = np.sin(x) # 正弦函数
# 最简单的调用:x, y
plt.plot(x, y)
plt.title('Simple Line Plot')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True, alpha=0.3)
plt.show()
示例 2:多条曲线 + 格式字符串
在同一图上绘制多条曲线,使用不同的颜色、线型和标记。
实例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 50)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.exp(-x / 3) # 阻尼正弦
# 多条曲线,每种使用不同格式
plt.plot(x, y1, 'b-o', label='sin(x)') # 蓝色实线 + 圆点
plt.plot(x, y2, 'r--s', label='cos(x)') # 红色虚线 + 方块
plt.plot(x, y3, 'g-.^', label='damped sin(x)') # 绿色点划线 + 三角
plt.title('Multiple Lines with Different Styles')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
import numpy as np
x = np.linspace(0, 10, 50)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.exp(-x / 3) # 阻尼正弦
# 多条曲线,每种使用不同格式
plt.plot(x, y1, 'b-o', label='sin(x)') # 蓝色实线 + 圆点
plt.plot(x, y2, 'r--s', label='cos(x)') # 红色虚线 + 方块
plt.plot(x, y3, 'g-.^', label='damped sin(x)') # 绿色点划线 + 三角
plt.title('Multiple Lines with Different Styles')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
示例 3:使用关键字参数自定义样式
使用关键字参数更精细地控制线条外观。
实例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
fig, ax = plt.subplots(figsize=(8, 4), layout='constrained')
# 使用关键字参数而非格式字符串,更易读
ax.plot(x, np.sin(x),
color='steelblue', # 颜色名称
linestyle='-', # 实线
linewidth=2.5, # 线宽
marker='o', # 圆点标记
markersize=4, # 标记大小
markerfacecolor='red', # 标记填充色
markeredgecolor='black', # 标记边框色
markeredgewidth=0.5, # 标记边框宽
alpha=0.8, # 整体透明度
label='sin(x)')
# 对比:无标记的虚线
ax.plot(x, np.cos(x),
color='#ff6600', # 十六进制颜色
linestyle='--',
linewidth=2,
label='cos(x)')
ax.set_title('Customized Line Styles', fontsize=14)
ax.set_xlabel('x (radians)')
ax.set_ylabel('Amplitude')
ax.legend(loc='upper right')
ax.grid(True, alpha=0.2)
plt.show()
print("runoob: customized plot displayed")
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
fig, ax = plt.subplots(figsize=(8, 4), layout='constrained')
# 使用关键字参数而非格式字符串,更易读
ax.plot(x, np.sin(x),
color='steelblue', # 颜色名称
linestyle='-', # 实线
linewidth=2.5, # 线宽
marker='o', # 圆点标记
markersize=4, # 标记大小
markerfacecolor='red', # 标记填充色
markeredgecolor='black', # 标记边框色
markeredgewidth=0.5, # 标记边框宽
alpha=0.8, # 整体透明度
label='sin(x)')
# 对比:无标记的虚线
ax.plot(x, np.cos(x),
color='#ff6600', # 十六进制颜色
linestyle='--',
linewidth=2,
label='cos(x)')
ax.set_title('Customized Line Styles', fontsize=14)
ax.set_xlabel('x (radians)')
ax.set_ylabel('Amplitude')
ax.legend(loc='upper right')
ax.grid(True, alpha=0.2)
plt.show()
print("runoob: customized plot displayed")
示例 4:使用 data 参数(DataFrame 支持)
当数据是 dict 或 pandas DataFrame 时,可使用字符串列名。
实例
import matplotlib.pyplot as plt
import numpy as np
# 将数据组织为字典
data = {
'time': np.arange(0, 10, 0.5),
'voltage': np.sin(np.arange(0, 10, 0.5)) * 5 + 10,
'current': np.cos(np.arange(0, 10, 0.5)) * 2 + 5,
}
fig, ax = plt.subplots(layout='constrained')
# 通过 data 参数 + 字符串列名引用数据
ax.plot('time', 'voltage', 'b-', data=data, label='Voltage (V)')
ax.plot('time', 'current', 'r--', data=data, label='Current (A)')
ax.set_title('Using data Parameter with Column Names')
ax.set_xlabel('Time (s)')
ax.set_ylabel('Value')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()
import numpy as np
# 将数据组织为字典
data = {
'time': np.arange(0, 10, 0.5),
'voltage': np.sin(np.arange(0, 10, 0.5)) * 5 + 10,
'current': np.cos(np.arange(0, 10, 0.5)) * 2 + 5,
}
fig, ax = plt.subplots(layout='constrained')
# 通过 data 参数 + 字符串列名引用数据
ax.plot('time', 'voltage', 'b-', data=data, label='Voltage (V)')
ax.plot('time', 'current', 'r--', data=data, label='Current (A)')
ax.set_title('Using data Parameter with Column Names')
ax.set_xlabel('Time (s)')
ax.set_ylabel('Value')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()
示例 5:在 Axes 对象上调用(推荐方式)
使用面向对象的 Axes 接口,在多子图场景中更清晰。
实例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
# 创建两个并排子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4),
layout='constrained')
# 左子图:数学函数
ax1.plot(x, np.sin(x), label='sin(x)')
ax1.plot(x, np.cos(x), label='cos(x)')
ax1.set_title('Math Functions')
ax1.legend()
ax1.grid(True, alpha=0.3)
# 右子图:数据趋势
data = np.random.randn(100).cumsum() # 随机游走
ax2.plot(data, color='teal', linewidth=1.5)
ax2.set_title('Random Walk (cumulative sum)')
ax2.set_xlabel('Step')
ax2.set_ylabel('Position')
ax2.grid(True, alpha=0.3)
plt.show()
import numpy as np
x = np.linspace(0, 10, 100)
# 创建两个并排子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4),
layout='constrained')
# 左子图:数学函数
ax1.plot(x, np.sin(x), label='sin(x)')
ax1.plot(x, np.cos(x), label='cos(x)')
ax1.set_title('Math Functions')
ax1.legend()
ax1.grid(True, alpha=0.3)
# 右子图:数据趋势
data = np.random.randn(100).cumsum() # 随机游走
ax2.plot(data, color='teal', linewidth=1.5)
ax2.set_title('Random Walk (cumulative sum)')
ax2.set_xlabel('Step')
ax2.set_ylabel('Position')
ax2.grid(True, alpha=0.3)
plt.show()
常见问题
plot() 中 x 和 y 的顺序
标准调用是 plot(x, y),x 在前、y 在后。
如果只传入一个数组,如 plot(y),则 x 自动取 range(0, len(y))。
如何绘制不连续的线段?
对于包含 NaN 的数据,plot() 会自动在 NaN 处断开线段,这可用于绘制分段线条。
fmt 字符串和关键字参数能同时使用吗?
可以,关键字参数会覆盖 fmt 字符串中的对应设置。例如 plot(x, y, 'ro', color='blue') 中,marker='o' 来自 fmt,但 color 会被覆盖为 blue。

Matplotlib 参考文档