如何创建处理特定值的matplotlib色图?

11 投票
1 回答
6193 浏览
提问于 2025-04-18 18:06

我该如何创建一个matplotlib的颜色映射,使得0(并且只有 0)对应白色,而其他值0 < v <= 1则对应一个平滑的渐变,比如rainbow(彩虹)呢?

看起来LinearSegmentedColormapListedColormap都无法做到这一点。

1 个回答

20

有几种方法可以做到这一点。从你描述的值范围来看,你只需要使用 cmap.set_under('white'),然后把 vmin 设置为 0 + eps

比如:

import matplotlib.pyplot as plt
import numpy as np

cmap = plt.get_cmap('rainbow')
cmap.set_under('white')  # Color for values less than vmin

data = np.random.random((10, 10))
data[3:5, 7:] = 0

# Very small float such that 0.0 != 0 + eps
eps = np.spacing(0.0)

fig, ax = plt.subplots()
im = ax.imshow(data, interpolation='nearest', vmin=eps, cmap=cmap)
fig.colorbar(im, extend='min')
plt.show()

enter image description here

不过,如果0在你的数据范围中间的话,你可以把这些值遮住,然后用 cmap.set_bad 设置颜色(我会用黑色来区分被遮住的部分和默认颜色):

import matplotlib.pyplot as plt
import numpy as np

cmap = plt.get_cmap('rainbow')
cmap.set_bad('black')

data = np.random.normal(0, 1, (10, 10))
data[3:5, 7:] = 0

data = np.ma.masked_equal(data, 0)

fig, ax = plt.subplots()
im = ax.imshow(data, interpolation='nearest', cmap=cmap)
fig.colorbar(im)
plt.show()

enter image description here

撰写回答