杰瑞科技汇

Python colorbar怎么用?参数设置与实例技巧

本文将按照从基础到高级的顺序,系统地介绍 colorbar 的用法。

Python colorbar怎么用?参数设置与实例技巧-图1
(图片来源网络,侵删)

为什么需要 colorbar

想象一下,你画了一张用颜色深浅表示温度的地图,如果没有 colorbar,别人看到红色、蓝色、黄色,完全不知道这些颜色具体对应多少摄氏度。colorbar 就像图例一样,它是一个垂直或水平的条,旁边标注了颜色和对应的数值,让图表信息完整且易于理解。


最基础的用法:plt.colorbar()

这是最简单、最直接的方法,适用于快速绘图。

工作原理:

  1. 使用 plt.imshow(), plt.pcolormesh(), plt.contourf() 等函数绘制一个数据矩阵,这些函数会返回一个 AxesImageQuadContourSet 对象。
  2. 将这个对象作为参数传递给 plt.colorbar()

示例代码:

Python colorbar怎么用?参数设置与实例技巧-图2
(图片来源网络,侵删)
import numpy as np
import matplotlib.pyplot as plt
# 1. 创建一些示例数据
data = np.random.rand(10, 10) * 100 # 一个 10x10 的随机矩阵,值在 0-100 之间
# 2. 绘制伪彩色图
# plt.imshow 会返回一个 AxesImage 对象
img = plt.imshow(data, cmap='viridis') 
# 3. 添加颜色条
# plt.colorbar() 会自动使用上一步的图像对象
plt.colorbar(img)
# 4. 添加标题和标签"基础用法: plt.colorbar(img)")
plt.xlabel("X 轴")
plt.ylabel("Y 轴")
plt.show()

输出: 你会看到一个 10x10 的彩色网格,右边有一个垂直的颜色条,颜色从紫色(低值)渐变到黄色(高值)。


面向对象的用法:fig.colorbar()

在更复杂的绘图中,我们通常使用 fig, ax = plt.subplots() 的方式创建图形和坐标轴,在这种情况下,推荐使用 fig.colorbar(),它提供了更精确的控制。

工作原理:

  1. 创建 FigureAxes 对象。
  2. ax 上绘制图像,并获取其返回对象(如 im)。
  3. 使用 fig.colorbar(im, ax=ax) 将颜色条添加到 fig 上,并指定它关联到哪个 ax

示例代码:

Python colorbar怎么用?参数设置与实例技巧-图3
(图片来源网络,侵删)
import numpy as np
import matplotlib.pyplot as plt
# 1. 创建 Figure 和 Axes
fig, ax = plt.subplots(figsize=(8, 6))
# 2. 创建数据
data = np.random.rand(10, 10) * 100
# 3. 在 ax 上绘制图像
im = ax.imshow(data, cmap='plasma')
# 4. 使用 fig.colorbar 添加颜色条,并指定关联的 ax
cbar = fig.colorbar(im, ax=ax)
# 5. 设置颜色条的标签
cbar.set_label('数值大小 (单位: m/s)')
# 6. 设置 ax 的标题
ax.set_title("面向对象用法: fig.colorbar()")
plt.show()

输出: 与上一个例子类似,但这种方式在多子图布局中优势巨大。


colorbar 的核心参数详解

掌握这些参数,你就能随心所欲地定制颜色条。

1 orientation: 控制方向

  • 'vertical' (默认): 垂直颜色条。
  • 'horizontal': 水平颜色条。

示例:

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
data = np.random.rand(10, 10)
# 垂直颜色条
im1 = ax1.imshow(data, cmap='viridis')
cbar1 = fig.colorbar(im1, ax=ax1, orientation='vertical')
ax1.set_title("垂直颜色条")
# 水平颜色条
im2 = ax2.imshow(data, cmap='magma')
cbar2 = fig.colorbar(im2, ax=ax2, orientation='horizontal')
ax2.set_title("水平颜色条")
plt.tight_layout()
plt.show()

2 label: 设置颜色条标签

使用 cbar.set_label() 方法来添加描述性的标签,这是强烈推荐的做法。

fig, ax = plt.subplots()
data = np.random.rand(10, 10)
im = ax.imshow(data, cmap='coolwarm')
cbar = fig.colorbar(im, ax=ax)
cbar.set_label('温度 (°C)') # 设置标签
ax.set_title("带标签的颜色条")
plt.show()

3 shrinkaspect: 调整颜色条大小

  • shrink: 一个缩放因子(0到1之间),用于缩短颜色条的长度,默认为1。
  • aspect: 颜色条的宽高比。aspect=20 表示颜色条宽度是高度的20倍,当你使用 shrink 时,aspect 会影响最终的视觉效果。

示例:

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
data = np.random.rand(10, 10)
# 默认大小
im1 = ax1.imshow(data)
cbar1 = fig.colorbar(im1, ax=ax1)
ax1.set_title("默认大小")
# 缩短颜色条
im2 = ax2.imshow(data)
cbar2 = fig.colorbar(im2, ax=ax2, shrink=0.5) # 缩短到原来的一半
ax2.set_title("shrink=0.5")
plt.tight_layout()
plt.show()

4 ticksformat: 控制刻度和格式

  • ticks: 指定颜色条上显示哪些刻度位置。ticks=[0, 25, 50, 75, 100]
  • format: 设置刻度标签的格式,可以使用字符串格式化(如 '%0.1f')或 matplotlib.ticker 模块中的格式化器。

示例:

import matplotlib.ticker as ticker
fig, ax = plt.subplots()
data = np.arange(100).reshape(10, 10)
im = ax.imshow(data, cmap='viridis')
# 设置刻度位置和格式
cbar = fig.colorbar(im, ax=ax, ticks=[0, 25, 50, 75, 99])
cbar.ax.set_yticklabels(['极低', '低', '中', '高', '极高']) # 自定义标签文本
cbar.set_label('性能指标')
# 或者使用格式化器
# cbar.formatter = ticker.FormatStrFormatter('%d') # 显示整数
# cbar.update_ticks()
ax.set_title("自定义刻度和标签")
plt.show()

5 extend: 处理超出范围的数据

如果你的数据超出了 colormap 的默认范围(数据范围是 -20 到 120,但 colormap 是 0-100),extend 参数会自动在颜色条的两端添加三角形箭头,表示数据超出了显示的范围。

  • 'neither' (默认)
  • 'min': 数据最小值小于颜色范围下限。
  • 'max': 数据最大值大于颜色范围上限。
  • 'both'

示例:

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
data1 = np.linspace(0, 1, 100).reshape(10, 10)
data2 = np.linspace(-0.5, 1.5, 100).reshape(10, 10)
# 默认情况,数据被裁剪到 cmap 范围
im1 = ax1.imshow(data2, cmap='viridis', vmin=0, vmax=1)
cbar1 = fig.colorbar(im1, ax=ax1, extend='neither')
ax1.set_title("extend='neither' (数据被裁剪)")
# 使用 extend 显示超出部分
im2 = ax2.imshow(data2, cmap='viridis', vmin=0, vmax=1)
cbar2 = fig.colorbar(im2, ax=ax2, extend='both') # 两端都有超出
ax2.set_title("extend='both' (显示超出部分)")
plt.tight_layout()
plt.show()

高级用法:多子图中的颜色条

在包含多个子图的复杂图形中,colorbar 的放置需要特别注意,推荐使用 make_axes_locatable 工具,它可以智能地为颜色条腾出空间,并保持布局整洁。

示例:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
fig, ax = plt.subplots(figsize=(8, 6))
# 创建数据
data = np.random.rand(10, 10)
im = ax.imshow(data, cmap='hot')
# 使用 make_axes_locatable 创建一个适合放置 colorbar 的 axes
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.1) # 右侧,宽度为5%,间距0.1
# 在新创建的 cax 上添加 colorbar
fig.colorbar(im, cax=cax)
ax.set_title("使用 make_axes_locatable 添加 colorbar")
plt.show()

append_axes 参数说明:

  • "right" / "left" / "top" / "bottom": 在指定方向添加。
  • size: 新 axes 的大小,可以是百分比字符串(如 "5%")或浮点数(表示英寸)。
  • pad: 新 axes 与原 axes 之间的间距。

常见问题与技巧

Q1: 为什么我的颜色条没有显示?

  • 最常见原因:你忘记绘制图像了。colorbar 是依附于一个已经存在的图像对象(imshow, pcolormesh 等)的。
  • 解决方法:确保 colorbar() 之前有绘图代码,并且将绘图函数的返回对象作为参数传入。

Q2: 如何为多个子图共享一个颜色条?

这是一个非常常见的需求,核心思想是:只绘制一次颜色条,然后让它关联到所有子图

技巧:将所有子图的数据合并计算一个统一的 vminvmax

示例:

import numpy as np
import matplotlib.pyplot as plt
# 创建数据和子图
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
data_list = [np.random.rand(10, 10)*i for i in range(1, 5)]
# 计算全局 vmin 和 vmax
vmin = min(data.min() for data in data_list)
vmax = max(data.max() for data in data_list)
# 绘制所有子图,并使用统一的颜色范围
ims = []
for i, ax in enumerate(axes.flat):
    im = ax.imshow(data_list[i], vmin=vmin, vmax=vmax, cmap='viridis')
    ims.append(im)
    ax.set_title(f"数据 {i+1}")
# 只添加一个颜色条,关联到最后一个图像对象
# 或者任意一个,因为它们的颜色范围是一样的
fig.colorbar(ims[-1], ax=axes, orientation='horizontal', 
             pad=0.2, shrink=0.8, label='共享数值范围')
plt.tight_layout()
plt.show()

Q3: 如何更改颜色条的字体大小?

可以通过访问 cbar.ax 来修改其坐标轴的属性。

fig, ax = plt.subplots()
data = np.random.rand(10, 10)
im = ax.imshow(data, cmap='viridis')
cbar = fig.colorbar(im, ax=ax)
# 修改刻度标签和颜色条标签的字体大小
cbar.ax.tick_params(labelsize=12) # 刻度数字大小
cbar.set_label('我的标签', fontsize=14) # 标签文本大小
ax.set_title("修改字体大小")
plt.show()

用法场景 推荐方法 关键点
简单快速绘图 plt.colorbar(img) 最直接,适合单图。
面向对象/复杂图形 fig.colorbar(im, ax=ax) 控制力更强,是标准做法。
调整方向 orientation='vertical''horizontal' 根据布局选择。
添加说明 cbar.set_label('...') 必做,提升图表可读性。
调整尺寸 shrink, aspect 适应有限空间。
精确控制刻度 ticks, format 使用 ticker 模块实现高级格式化。
处理越界数据 extend='min'/'max'/'both' 清晰展示数据全貌。
多子图布局 make_axes_locatable 布局优雅,避免重叠。
共享颜色条 统一 vmin/vmax,只加一个 colorbar 确保数据可比性。

希望这份详细的指南能帮助你完全掌握 matplotlibcolorbar 的用法!

分享:
扫描分享到社交APP
上一篇
下一篇