如何使两个值之间有空白的发散颜色条Matplotlib?

2024-05-14 09:49:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用颜色贴图创建一个颜色栏。我希望颜色贴图在-6到6的范围内,但在-1.5到-5的范围内为白色,然后从那里开始发散,红色表示大于-.5的数字,蓝色表示小于-1.5

有什么简单的方法可以做到这一点吗

我试着这样做:

lower = plt.cm.seismic(np.linspace(-6, -1.5, 10))
upper = plt.cm.seismic(np.linspace(-.5, 6, 10))
colors = np.vstack((lower, upper))
tmap = matplotlib.colors.LinearSegmentedColormap.from_list('map_white', colors)

Tags: 方法颜色npcmplt数字upperlower
1条回答
网友
1楼 · 发布于 2024-05-14 09:49:00

A。创建新的颜色映射

您确实可以为这种情况创建一个新的颜色映射

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

p = [-6, -1.5, 0.5, 6]
f = lambda x: np.interp(x, p, [0, 0.5, 0.5, 1])

cmap = LinearSegmentedColormap.from_list('map_white', 
              list(zip(np.linspace(0,1), plt.cm.seismic(f(np.linspace(min(p), max(p)))))))

plt.imshow(np.random.rand(10,10)*12-6, vmin=min(p), vmax=max(p), cmap=cmap)
plt.colorbar()

plt.show()

B。创建新的规范化

或者,创建具有两个内点的新规格化,这两个内点被插值到。这与merge-colormaps-in-matplotlib的答案类似,只是两点几乎相等

import numpy as np
import matplotlib.pyplot as plt


class StretchOutNormalize(plt.Normalize):
    def __init__(self, vmin=None, vmax=None, low=None, up=None, clip=False):
        self.low = low
        self.up = up
        plt.Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):
        x, y = [self.vmin, self.low, self.up, self.vmax], [0, 0.5-1e-9, 0.5+1e-9, 1]
        return np.ma.masked_array(np.interp(value, x, y))


norm=StretchOutNormalize(vmin=-6, vmax=6, low=-1.5, up=0.5)

plt.imshow(np.random.rand(10,10)*12-6, cmap="seismic", norm=norm)
plt.colorbar()

plt.show()

在这两种情况下,结果是相同的:

pic

相关问题 更多 >

    热门问题