gpt4 book ai didi

python - 修改离散 LinearSegmentedColormap

转载 作者:行者123 更新时间:2023-11-28 20:23:41 27 4
gpt4 key购买 nike

我是一名气候学家,经常绘制异常现象,例如使用“蓝到白到红”颜色图的温度场。为了使图表更具可读性,我使用我在互联网上“找到”的函数(但我不太了解)将颜色图离散化为一定数量的级别(箱):

像这样:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
import matplotlib.colors as cols
from numpy.random import randn

def cmap_discretize(cmap, N):
colors_i = np.concatenate((np.linspace(0, 1., N), (0.,0.,0.,0.)))
colors_rgba = cmap(colors_i)
indices = np.linspace(0, 1., N+1)
cdict = {}
for ki,key in enumerate(('red','green','blue')):
cdict[key] = [ (indices[i], colors_rgba[i-1,ki], colors_rgba[i,ki]) for i in xrange(N+1) ]
# Return colormap object.
return cols.LinearSegmentedColormap(cmap.name + "_%d"%N, cdict, 1024)



cmap_disc= cmap_discretize(cm.RdBu_r,12)


fig, ax = plt.subplots()
data = np.clip(randn(250, 250), -1, 1)

cax = ax.pcolor(data, cmap=cmap_disc)
plt.colorbar(cax)

plt.show()

这导致

enter image description here

现在我想将最中间的两个部分(即接近 0 的两个部分)设置为白色,因为我不想显示非常小的偏差。

我的目标是最终得到类似这样的东西:

enter image description here

我真的很难弄清楚如何相应地修改这些 LinearSegmentedColormap。有人可以帮我吗?

最佳答案

您找到的函数构建了一个数据结构(在 cdict 中)用于定义 LinearSegmentedColormap使用不执行任何插值的段(即 y1 行中的 i 始终与 y0 行中的 i+1 相同,这给出了常量或离散颜色“带”)。

cdict是一个奇怪的数据结构,一个包含键 'red' 的字典, 'green''blue' .这些键中的每一个的值都是一个列表结构,其中包含 (x, y0, y1) 形式的元组. x是颜色图坐标,它是介于 0 和 1 之间的一些 float 。y0x 的“左”边的颜色值, 和 y1x 右边的颜色值.颜色在 x 的连续值之间的波段中线性插值。 ;如果第一个元组由 (0, A, B) 给出第二个元组 (X, C, D) , 那么一个点的颜色t0 之间和 X将由 (t - 0) / (X - 0) * (C - B) + B 给出.

就您的目的而言,您的函数运行良好,但需要将颜色图中间附近的“ strip ”替换为白色。您可以尝试以下操作:

def cmap_discretize(cmap, N):
colors_i = np.concatenate((np.linspace(0, 1., N), (0.,0.,0.,0.)))
colors_rgba = cmap(colors_i)
indices = np.linspace(0, 1., N+1)
cdict = {}
for ki,key in enumerate(('red','green','blue')):
cdict[key] = [ (indices[i], colors_rgba[i-1,ki], colors_rgba[i,ki]) for i in xrange(N+1) ]
# "white out" the bands closest to the middle
num_middle_bands = 2 - (N % 2)
middle_band_start_idx = (N - num_middle_bands) // 2
for middle_band_idx in range(middle_band_start_idx,
middle_band_start_idx + num_middle_bands):
for key in cdict.keys():
old = cdict[key][middle_band_idx]
cdict[key][middle_band_idx] = old[:2] + (1.,)
old = cdict[key][middle_band_idx + 1]
cdict[key][middle_band_idx + 1] = old[:1] + (1.,) + old[2:]
# Return colormap object.
return cols.LinearSegmentedColormap(cmap.name + "_%d"%N, cdict, 1024)

关于python - 修改离散 LinearSegmentedColormap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19199359/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com