Matplotlib - 色标



色标是绘图中使用的颜色比例尺的可视化表示。它显示了数据中从最小值到最大值的颜色比例尺,帮助我们理解绘图中的颜色变化。

在下图中,您可以看到一个用红色矩形突出显示的简单色标 -

Color Intro Image

Matplotlib 中的色标

Matplotlib 库提供了一个用于处理色标的工具,包括其创建、放置和自定义。

matplotlib.colorbar 模块负责创建色标,但是可以使用Figure.colorbar() 或其等效的 pyplot 包装器pyplot.colorbar() 函数创建色标。这些函数在内部使用 Colorbar 类以及make_axes_gridspec(用于 GridSpec 定位的轴)或make_axes(用于非 GridSpec 定位的轴)。

并且色标需要是一个“可映射” (即 matplotlib.cm.ScalarMappable) 对象,通常是通过 imshow() 函数生成的 AxesImage。如果您想在没有附加图像的情况下创建色标,则可以使用没有关联数据的 ScalarMappable。

示例 1

这是一个简单的示例,使用ScalarMappable 类创建一个没有附加绘图的水平色标。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# Create a figure and axis for the colorbar
fig, ax = plt.subplots(figsize=(6, 1), constrained_layout=True)

# Define a colormap and normalization for the colorbar
cmap = mpl.cm.cool
norm = mpl.colors.Normalize(vmin=5, vmax=10)

# Create a ScalarMappable without associated data using the defined cmap and norm
scalar_mappable = mpl.cm.ScalarMappable(norm=norm, cmap=cmap)

# Add a horizontal colorbar to the figure 
colorbar = fig.colorbar(scalar_mappable, cax=ax, orientation='horizontal', label='Some Units')

# Set the title and display the plot
plt.title('Basic Colorbar')
plt.show()

输出

执行以上代码后,我们将获得以下输出 -

Color Bar Output 1

示例 2

这是另一个示例,使用pyplot.colorbar() 函数和默认参数为绘图创建简单的色标。

import matplotlib.pyplot as plt
import numpy as np

# Generate sample data
data = np.random.random((10, 10))

# Create a plot with an image and a colorbar
fig, ax = plt.subplots(figsize=(7,4))
im = ax.imshow(data, cmap='viridis')

# Add a colorbar to the right of the image
cbar = plt.colorbar(im, ax=ax)

# Show the plot
plt.show()
print('Successfully drawn the colorbar...')

输出

Color Bar Output 2
Successfully drawn the colorbar...

自动色标放置

色标的自动放置是一种简单的方法。这确保每个子图都有自己的色标,清楚地指示每个子图中图像数据的定量范围。

示例

此示例演示了多个子图的自动色标放置。

import matplotlib.pyplot as plt
import numpy as np

# Create a 2x2 subplot grid
fig, axs = plt.subplots(1, 2, figsize=(7,3))
cmaps = ['magma', 'coolwarm']

# Add random data with different colormaps to each subplot
for col in range(2):
   ax = axs[col]
   pcm = ax.pcolormesh(np.random.random((20, 20)) * (col + 1), cmap=cmaps[col])

   # Add a colorbar for the each subplots
   fig.colorbar(pcm, ax=ax, pad=0.03)

plt.show()
print('Successfully drawn the colorbar...')

输出

Color Bar Output 3
Successfully placed the colorbar...

手动色标放置

这种方法允许我们明确确定绘图中色标的位置和外观。当自动放置无法实现所需的布局时,这可能是必要的。

通过创建内嵌轴,可以使用inset_axes()add_axes(),然后通过cax 关键字参数将其分配给色标,用户可以获得所需的输出。

示例

这是一个示例,演示了如何在绘图中手动确定色标放置。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# Generate random data points
npoints = 1000
x, y = np.random.normal(10, 2, (2, npoints))

# Create a subplot
fig, ax = plt.subplots(figsize=(7,4))

# Set title
plt.title('Manual Colorbar Placement')

# Draw the plot
hexbin_artist = ax.hexbin(x, y, gridsize=20, cmap='gray_r', edgecolor='white')

# Manually create an inset axes for the colorbar
cax = fig.add_axes([0.8, 0.15, 0.05, 0.3])

# Add a colorbar using the hexbin_artist and the manually created inset axes
colorbar = fig.colorbar(hexbin_artist, cax=cax)

# Display the plot
plt.show()

输出

执行以上代码后,我们将获得以下输出 -

Color Bar Output 4

自定义色标

色标的外观,包括刻度、刻度标签和标签,可以根据具体需求进行自定义。垂直色标通常在 y 轴上显示这些元素,而水平色标在 x 轴上显示这些元素。ticks 参数用于设置刻度,format 参数有助于格式化可见色标轴上的刻度标签。

示例 1

此示例使用imshow() 方法将数据显示为图像,并将色标水平放置到图像上并指定标签。

import matplotlib.pyplot as plt
import numpy as np

# Create a subplot
fig, ax = plt.subplots(figsize=(7, 4))

# Generate random data
data = np.random.normal(size=(250, 250))
data = np.clip(data, -1, 1)

# Display the data using imshow with a specified colormap
cax = ax.imshow(data, cmap='afmhot')
ax.set_title('Horizontal Colorbar with Customizing Tick Labels')

# Add a horizontal colorbar and set its orientation and label
cbar = fig.colorbar(cax, orientation='horizontal', label='A colorbar label')

# Adjust ticks on the colorbar
cbar.set_ticks(ticks=[-1, 0, 1])
cbar.set_ticklabels(['Low', 'Medium', 'High'])

# Show the plot
plt.show()

输出

执行以上代码后,我们将获得以下输出 -

Color Bar Output 5

示例 2

此示例演示了如何自定义色标的位置、宽度、颜色、刻度数量、字体大小以及更多属性。

import numpy as np
from matplotlib import pyplot as plt

# Adjust figure size and autolayout
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

# Generate random data
data = np.random.randn(4, 4)

# Plot the data with imshow
im = plt.imshow(data, interpolation='nearest', cmap="PuBuGn")

# Add colorbar and adjust its position
# Decrease colorbar width and shift position to the right
clb = plt.colorbar(im, shrink=0.9, pad=0.05)  

# Set the top label for colorbar 
clb.ax.set_title('Color Bar Title')

# Customize color of ticks
clb.ax.set_yticks([0, 1.5, 3, 4.5], labels=["A", "B", "C", "D"])

# Change color and font size of ticks
clb.ax.tick_params(labelcolor='red', labelsize=20)  

plt.show()

输出

执行以上代码后,您将获得以下输出 -

Color Bar Output 6
广告