plt.plot
是 Matplotlib 中最常用的函数之一,用于绘制线形图。该函数非常灵活,可以通过各种参数自定义图形的外观。下面将深入讲解 plt.plot
的使用,并通过多个例子展示其功能。
理论概述
plt.plot
的基本语法:
python
plt.plot(x, y, format_string, **kwargs)
x
:x 轴数据。y
:y 轴数据。format_string
:可选,指定线条颜色、标记和线型的格式字符串(如'r*--'
)。**kwargs
:可选,用于设置线条属性的关键字参数。
format_string
详解
- 颜色(color):可以使用单个字母表示颜色,如 'r'(红色)、'b'(蓝色)、'g'(绿色)、'k'(黑色)等。
- 标记(marker):用于表示数据点的标记样式,如 '*'(星号)、'o'(圆圈)、's'(方块)等。
- 线型(linestyle):用于指定线条样式,如 '-'(实线)、'--'(虚线)、'-.'(点划线)、':'(点线)等。
实际例子
示例1:基本线形图
python
import matplotlib.pyplot as plt
x = range(1, 11)
y = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
plt.plot(x, y)
plt.title('基本线形图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.show()
示例2:使用格式字符串自定义图形
python
import matplotlib.pyplot as plt
x = range(1, 11)
y1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
y2 = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
plt.plot(x, y1, 'r*--', label='质数')
plt.plot(x, y2, 'bo-', label='平方数')
plt.title('自定义格式的线形图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.show()
示例3:使用关键字参数自定义图形
python
import matplotlib.pyplot as plt
x = range(1, 11)
y1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
y2 = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
plt.plot(x, y1, color='red', marker='*', linestyle='--', label='质数')
plt.plot(x, y2, color='blue', marker='o', linestyle='-', label='平方数')
plt.title('使用关键字参数的线形图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.show()
示例4:绘制带有误差棒的图形
python
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y = np.sin(x)
yerr = 0.2
plt.errorbar(x, y, yerr=yerr, fmt='o-', ecolor='red', capsize=5)
plt.title('带有误差棒的线形图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.show()
示例5:绘制多条线并使用不同的样式
python
import matplotlib.pyplot as plt
x = range(1, 11)
y1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
y2 = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
y3 = [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
plt.plot(x, y1, 'r*--', label='质数')
plt.plot(x, y2, 'bo-', label='平方数')
plt.plot(x, y3, 'gs-.', label='立方数')
plt.title('多条线形图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.show()
示例6:使用不同的线宽和标记大小
python
import matplotlib.pyplot as plt
x = range(1, 11)
y1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
y2 = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
plt.plot(x, y1, 'r*--', linewidth=2, markersize=10, label='质数')
plt.plot(x, y2, 'bo-', linewidth=4, markersize=5, label='平方数')
plt.title('使用不同线宽和标记大小的线形图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.show()
示例7:绘制对数坐标轴的图形
python
import matplotlib.pyplot as plt
x = range(1, 11)
y = [10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000]
plt.plot(x, y, 'g*-')
plt.yscale('log')
plt.title('对数坐标轴的线形图')
plt.xlabel('X轴')
plt.ylabel('Y轴(对数)')
plt.show()
示例8:自定义图例位置和样式
python
import matplotlib.pyplot as plt
x = range(1, 11)
y1 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
y2 = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
plt.plot(x, y1, 'r*--', label='质数')
plt.plot(x, y2, 'bo-', label='平方数')
plt.title('自定义图例位置和样式')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend(loc='upper left', fontsize='large', shadow=True)
plt.show()
其他常用参数
除了 format_string
之外,plt.plot
还支持许多其他参数,用于调整图形细节:
linewidth
/lw
:线宽。markersize
/ms
:标记大小。markeredgecolor
/mec
:标记边缘颜色。markerfacecolor
/mfc
:标记填充颜色markeredgewidth
/mew
:标记边缘线宽alpha
:透明度,0到1之间的浮点数zorder
:绘制顺序,数值越大绘制越在上层label
:图例标签linestyle
/ls
:同format_string
中的 linestyle
设置坐标轴范围和比例
通过一些特殊参数,我们还可以控制坐标轴的范围和比例尺度:
xlim
/ylim
:设置 x/y 轴的数据显示范围xscale
/yscale
:设置 x/y 轴的刻度规则,如线性(linear
)、对数(log
)等xticks
/yticks
:设置 x/y 轴应显示的刻度位置
示例:
python
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 10, 100)
y = x**2
plt.plot(x, y)
plt.xlim([-5, 5]) # 设置 x 轴显示范围
plt.ylim([0, 30]) # 设置 y 轴显示范围
plt.xscale('symlog', linthresh=0.01) # 对数坐标轴,但在 0 附近使用线性比例
plt.xticks([-5, -1, 0, 1, 5]) # 自定义 x 轴刻度
plt.title('自定义坐标轴范围和比例')
plt.show()
多子图布局
plt.subplot
可以将图形区域分割成多个子区域,每个子区域中可绘制不同的图形。它的语法是:
python
plt.subplot(nrows, ncols, index)
nrows
:子图的行数ncols
:子图的列数index
:子图的索引,从1开始递增
示例:
python
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1) # 1行2列,第1个子图
plt.plot(x, y1)
plt.title('Sine Wave')
plt.subplot(1, 2, 2) # 1行2列,第2个子图
plt.plot(x, y2, 'r--')
plt.title('Cosine Wave')
plt.tight_layout()
plt.show()
除了subplot
之外,matplotlib还提供了subplot2grid
和gridspec.GridSpec
等更灵活的子图布局方式。
图形输出
plt.savefig
可以将当前图形保存为文件,支持多种格式如PNG、JPG、EPS、SVG等:
python
plt.savefig('figure.png', dpi=300, bbox_inches='tight')
其中dpi
设置输出分辨率,bbox_inches
控制输出时是否剪裁掉图形周围的空白区域。
交互式可视化
除了静态的图像输出,Matplotlib 还支持交互式的数据可视化。我们可以使用 plt.ion()
打开交互模式,然后使用 plt.show(block=False)
不阻塞地显示图形。
在交互模式下,我们可以动态更新图形内容,实现实时数据可视化等功能。示例:
python
import matplotlib.pyplot as plt
import numpy as np
plt.ion() # 打开交互模式
fig, ax = plt.subplots()
ln, = ax.plot([], [], 'r-') # 创建初始化的空线条
ax.set_xlim(0, 10)
ax.set_ylim(-1, 1)
x = np.linspace(0, 10, 100)
for i in range(100):
y = np.sin(x + i/10)
ln.set_data(x, y)
fig.canvas.draw()
fig.canvas.flush_events()
plt.ioff() # 关闭交互模式
该示例会实时绘制一条正弦波,波形随时间推移而移动。
plt.ginput
则允许用户在图形上点击鼠标进行交互,常用于标记数据点等功能。
使用 OO 接口自定义图形
Matplotlib 不仅提供了像 plt.plot
这样的快捷函数接口,也支持面向对象编程风格。通过显式创建 Figure 和 Axes 对象,并使用相应的方法,我们可以实现更细粒度的图形自定义。
python
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-np.pi, np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建 Figure 和 Axes 对象
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 6))
# 使用对象方法设置属性
ax1.plot(x, y1, 'b-')
ax1.set_title('Sine Wave')
ax1.set_ylim([-1.5, 1.5])
ax2.plot(x, y2, 'r--')
ax2.set_title('Cosine Wave')
ax2.set_ylim([-1.5, 1.5])
fig.tight_layout()
plt.show()
使用 OO 接口可以更灵活地控制图形元素,但代码也会变得更加冗长。在简单的场景下,使用快捷函数接口就可以了,但在需要高度自定义时,OO 接口会更加有用。
自定义 Colormap
Colormap 用于将数值数据映射到颜色值,对于可视化大量数据非常有用。Matplotlib 内置了多种 colormap,也支持自定义颜色映射。
内置的 colormap 可以通过 plt.cm.名称
访问,例如 plt.cm.viridis
是一种很流行的 colormap。
我们可以通过指定颜色列表来定义新的 colormap:
python
import matplotlib.pyplot as plt
import numpy as np
# 自定义 colormap
cmap = plt.colormaps['viridis']
my_cmap = cmap.from_list('my_cmap', ['navy', 'royalblue', 'skyblue', 'lime'])
data = np.random.randn(30, 30)
fig, ax = plt.subplots()
im = ax.imshow(data, cmap=my_cmap)
fig.colorbar(im)
plt.show()
该示例创建了一个新的 colormap my_cmap
,包含了从深蓝到浅绿的四种颜色。然后使用该 colormap 可视化二维数据。
plt.colormaps.register
还允许我们将自定义的 colormap 注册到 Matplotlib 中,以供全局访问。
自定义 Colorbar
Colorbar 可以将数据值和颜色直观地关联起来。我们可以使用 plt.colorbar
或者 fig.colorbar(im)
显示 colorbar。
也可以通过参数对 colorbar 进行自定义,如修改尺寸、位置、刻度值和标签等:
python
import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(30, 30)
fig, ax = plt.subplots(figsize=(6, 4))
im = ax.imshow(data, cmap='RdBu')
# 自定义 colorbar
cbar = fig.colorbar(im, ax=ax, orientation='horizontal', shrink=0.6, pad=0.05)
cbar.set_label('Data Values', fontsize=12)
cbar.set_ticks([-2, -1, 0, 1, 2])
cbar.ax.tick_params(labelsize=10)
plt.show()
这个例子创建了一个水平放置的 colorbar,调整了它的大小和填充,并自定义了标签和刻度值。
总的来说,Matplotlib 提供了全面的工具来自定义 colormap 和 colorbar,使数据可视化更加清晰和富有吸引力。