我是个气候学家,经常用“蓝到白到红”的彩色地图绘制温度场的异常。为了使绘图更具可读性,我用我在互联网上“找到”的一个函数将colormap分为若干个级别(bin)(但我并不真正理解):
像这样:
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()
这导致
现在我想把最中间的两段(即接近0的那两段)设置为白色,因为我不想显示非常小的偏差。在
我的目标是最终得到类似的结果:
我真的很难弄清楚这些LinearSegmentedColormap是如何被相应地修改的。有人能帮我吗?在
您找到的函数构建了一个数据结构(在
cdict
)中,用不执行任何插值的段定义{a1}(即第i
行中的y1
总是与第i+1
行中的y0
相同,这就给出了常量或离散的颜色“带”)。在cdict
是一种奇怪的数据结构,是一个包含键'red'
、'green'
和{(x, y0, y1)
形式的元组的列表结构。x
是颜色贴图坐标,它是介于0和1之间的某个浮点数。^左边{cd11>的值是^{cd11>(0, A, B)
给出,第二个元组由(X, C, D)
给出,则0
和{(t - 0) / (X - 0) * (C - B) + B
给出。在出于您的目的,您的函数运行得很好,但需要将颜色图中间附近的“带”替换为白色。您可以尝试以下方法:
让我们从浏览现有代码开始
现在的问题是如何在中间创建一个“双”白色带的彩色地图。我会改变功能位,让它接受两个彩色地图(顶部和底部) ^{pr2}$您可以轻松地修改此选项,以便在两个以上的颜色贴图之间分割。在
相关问题 更多 >
编程相关推荐