Matplotlib Python/Matplotlib – 色条范围和显示值

Matplotlib Python/Matplotlib – 色条范围和显示值

在Matplotlib中使用色条(colorbar)是一种非常有用的方式来显示数据的变化,并给数据注入一些颜色。然而,有时候我们需要控制色条的范围,或者在色条中仅展示特定的区间,这种情况下就需要用到Matplotlib中色条的一些高级功能。

本文将介绍如何在Matplotlib中控制色条的范围并定制色条的显示值。

阅读更多:Matplotlib 教程

色条基础知识

在Matplotlib中,色条是在绘制图形时绘制的。如果没有说明我们将如何在下面的例子中添加一个色条。色条可以分为连续型和离散型。

  • 连续型:适用于连续范围的数据,如地图上的温度、高度等。一般使用colormap设置颜色映射函数,并使用plt.colorbar()函数绘制色条。
  • 离散型:适用于离散范围的数据,如数据集中的分类、分数等。可以使用BoundaryNorm或ListedColormap设置颜色映射函数,再使用plt.colorbar()函数绘制色条。

控制色条的范围

有时候我们需要控制色条的范围,例如仅展示一个数据子集的色条。可以使用vmax或vmin参数设置最大或最小的取值范围。例如,在下面的例子中,我们可以使用plt.imshow()函数显示一个随机数组,但是限制色条的范围在[0.2,0.8]之间:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.rand(10, 10)
fig, ax = plt.subplots()
im = ax.imshow(data, cmap="viridis", vmin=0.2, vmax=0.8)
cbar = ax.figure.colorbar(im, ax=ax)
cbar.ax.set_ylabel("value", rotation=-90, va="bottom")
plt.show()
Python

上述代码中,cmap参数设置了使用的颜色映射函数,vmin和vmax参数指定了色条的取值范围。图像中的色条就在[0.2,0.8]的取值范围内。

范围的非线性控制

有时候,我们需要对色条的范围做非线性的控制,例如只在数据的某个范围内对应一段特定的颜色。Matplotlib中提供了很多方法来完成这些任务。其中一种方法是使用matplotlib.colors.Normalize类,该类提供了代表颜色的标准化参数。

例如,我们可以控制图像中色条的值增加时的颜色变化速率。这可以通过不同的Normalize类实现,如下所示:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.rand(10, 10)
fig, axs = plt.subplots(2, 1, figsize=(6, 6.5), constrained_layout=True)
for ax, interp in zip(axs, [None, "sinc"]):
    pcm = ax.pcolormesh(data, norm=plt.Normalize(0.1, 0.9), cmap="viridis")
    fig.colorbar(pcm, ax=ax, shrink=0.6)
    ax.set_title(f"Interpolation [{interp}]")
plt.show()
Python

上述代码中,我们使用了两个子图来比较不同的标准化方式。左边的子图中没有任何标准化,右边的子图中使用了标准化函数sinc进行标准化。可以看到,在右边的子图中,色条在值增加时的颜色变化速率发生了一些变化。

定制色条的显示值

在Matplotlib中,色条的显示值默认是数值,但是,我们也可以将其改为文字,并自定义每个颜色对应的文字标签。

例如,我们可以使用FuncFormatter将数字标签转换为文本标签。在下面的例子中,我们用箭头标识数据集的最大值并在色条上添加相应的文本标签。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import Normalize
from matplotlib.cm import get_cmap
from matplotlib.ticker import FuncFormatter

np.random.seed(42)
data = np.random.randint(0, 101, size=(10, 10))

fig, ax = plt.subplots()

cmap = get_cmap("Greens")
norm = Normalize(vmin=0, vmax=100)

pcm = ax.pcolormesh(data, cmap=cmap, norm=norm)
cb = fig.colorbar(pcm, ax=ax, extend="max")

def fmt(x, pos):
    return f"{x:.0f}%"

cb.ax.yaxis.set_major_formatter(FuncFormatter(fmt))

max_value = np.max(data)
max_coords = np.where(data == max_value)
for x, y in zip(*max_coords):
    ax.text(y, x, max_value, ha="center", va="center", color="red", fontsize=12)
    ax.arrow(y, x, 0, -0.5, color="red", head_width=0.2, head_length=0.3)

plt.show()
Python

可以看到,色条的显示值被设置为百分比,并且在数据集中箭头指向了最大值的位置并标记了相应的标签。

总结

本文介绍了如何在Matplotlib中控制色条的范围,并定制色条的显示值。通过控制色条,我们可以更好地展示数据集中的变化和趋势,以及在数据中确定重要的阈值和限制。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册