在 Python 中,使用 Matplotlib 库来调整颜色条(Colorbar)的位置非常灵活,你可以通过 plt.colorbar() 或 fig.colorbar() 函数的 location 和 pad 等参数进行精确控制。

下面我将详细介绍几种常见的场景和对应的代码示例。
核心函数
主要有两种方式添加颜色条:
plt.colorbar(): 简单快捷,通常用于将颜色条附加到当前坐标轴(Axes)上。fig.colorbar(): 更灵活,可以指定将颜色条附加到哪个Axes对象上,这在多子图布局中尤其有用。
两者都接受一组关键的定位参数。
使用 location 参数 (Matplotlib 3.2+ 新特性)
这是最直观、最现代的方法,你可以直接指定颜色条相对于主图的位置。

location 参数的常用值有:
'right'(默认值): 主图的右侧。'left': 主图的左侧。'top': 主图的上方。'bottom': 主图的下方。
示例:将颜色条放在图的上方
import matplotlib.pyplot as plt
import numpy as np
# 创建数据
data = np.random.rand(10, 10)
# 创建图形和坐标轴
fig, ax = plt.subplots()
# 绘制图像
img = ax.imshow(data, cmap='viridis')
# 使用 location='top' 将颜色条放在顶部
cbar = fig.colorbar(img, ax=ax, location='top', pad=0.1)
# 添加标签
cbar.set_label('Value')
"Colorbar on Top")
plt.show()
代码解释:
fig.colorbar(img, ax=ax, ...): 我们使用fig.colorbar并明确指定ax参数,确保颜色条附加到我们创建的ax上。location='top': 这是最关键的一行,它将颜色条定位到坐标轴的顶部。pad=0.1:pad参数控制颜色条和主图之间的间距(以英寸为单位),你可以根据需要调整这个值。
示例:将颜色条放在图的左侧
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10, 10)
fig, ax = plt.subplots()
img = ax.imshow(data, cmap='plasma')
# 使用 location='left' 将颜色条放在左侧
cbar = fig.colorbar(img, ax=ax, location='left', pad=0.05)
cbar.set_label('Value')"Colorbar on Left")
plt.show()
使用 orientation 和 ax 参数 (传统方法)
在 location 参数出现之前,我们通过组合 orientation(方向)和 ax 参数来实现类似的效果。
orientation='vertical': 垂直颜色条(默认)。orientation='horizontal': 水平颜色条。
示例:水平颜色条(位于底部)
这是最常见的需求之一,你可以通过 orientation='horizontal' 并指定 ax 来实现。

import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10, 10)
fig, ax = plt.subplots()
img = ax.imshow(data, cmap='magma')
# 使用 orientation='horizontal' 创建水平颜色条
# 默认情况下它会附加在 ax 的底部
cbar = fig.colorbar(img, ax=ax, orientation='horizontal', pad=0.2)
cbar.set_label('Value')"Horizontal Colorbar at Bottom")
plt.show()
示例:垂直颜色条(位于左侧)
为了将垂直颜色条放在左侧,你需要稍微多做一些工作,因为默认是在右侧,通常我们会创建一个额外的坐标轴来容纳颜色条。
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10, 10)
fig, ax = plt.subplots()
# 绘制图像
img = ax.imshow(data, cmap='cividis')
# 创建一个位于左侧的垂直颜色条
# cax 是一个专门用于放置 colorbar 的坐标轴
# shrink 参数可以使 colorbar 变短一些
# aspect 参数控制 colorbar 的长宽比
cbar = fig.colorbar(img, cax=ax.inset_axes([0, 0, 0.05, 1]), orientation='vertical')
cbar.set_label('Value')"Vertical Colorbar on the Left (inset_axes)")
plt.show()
代码解释:
ax.inset_axes([left, bottom, width, height]): 这是一个非常强大的函数,它在当前坐标轴ax内部创建一个新的、嵌套的坐标轴cax。[0, 0, 0.05, 1]表示这个新坐标轴从ax的左下角 (0,0) 开始,宽度为ax宽度的 5%,高度为ax高度的 100%。fig.colorbar(img, cax=cax, ...): 我们将cax(新的小坐标轴)传递给fig.colorbar的cax参数,告诉 Matplotlib “请把颜色条画在这个小坐标轴里”。
在多子图(Subplots)中定位颜色条
当有多个子图时,使用 plt.colorbar() 可能会把颜色条附加到错误的子图上,强烈推荐使用 fig.colorbar() 并指定 ax 参数。
示例:将一个颜色条关联到多个子图
如果你希望一个颜色条能同时表示多个子图的数据范围,可以使用 axes 参数。
import matplotlib.pyplot as plt
import numpy as np
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
# 创建两个数据集,范围相同
data1 = np.random.rand(10, 10)
data2 = np.random.rand(10, 10)
# 在两个子图上绘制图像
im1 = ax1.imshow(data1, cmap='viridis')
im2 = ax2.imshow(data2, cmap='viridis')
# 为两个子图设置一个共享的颜色条
# 使用 fig.colorbar() 并将 ax1 和 ax2 都传递给 axes 参数
fig.colorbar(im1, ax=[ax1, ax2], label='Shared Value')
ax1.set_title('Subplot 1')
ax2.set_title('Subplot 2')
plt.tight_layout() # 自动调整子图间距
plt.show()
代码解释:
ax=[ax1, ax2]: 这是关键。fig.colorbar会自动找到一个合适的位置(通常是右侧)来放置颜色条,并确保它能够同时关联到ax1和ax2两个子图。
总结与建议
| 需求 | 推荐方法 | 关键参数 |
|---|---|---|
| 颜色条在右侧 (默认) | plt.colorbar(mappable) |
无需额外参数 |
| 颜色条在左侧 | fig.colorbar(mappable, ax=ax, location='left', pad=...) |
location='left' |
| 颜色条在顶部 | fig.colorbar(mappable, ax=ax, location='top', pad=...) |
location='top' |
| 颜色条在底部 | fig.colorbar(mappable, ax=ax, location='bottom', pad=...) |
location='bottom' |
| 多子图共享颜色条 | fig.colorbar(mappable, ax=[ax1, ax2, ...]) |
ax=[...] |
| 精确定位/自定义形状 | cax = ax.inset_axes([...])fig.colorbar(mappable, cax=cax) |
inset_axes, cax |
最佳实践:
- 优先使用
fig.colorbar(): 它比plt.colorbar()更明确、更可控,尤其是在复杂图形中。 - 对于 Matplotlib 3.2+,
location是首选: 它的语法更清晰,代码可读性更高。 - 调整
pad和shrink:pad控制间距(英寸),shrink控制颜色条的长度比例(shrink=0.8会让颜色条长度变为原来的80%),这两个参数经常一起使用以达到最佳视觉效果。
