从使用LinearSegmentedColormap制作的线性colourmap中提取RGB值

时间:2016-10-06 10:00:51

标签: python matplotlib colormap

我想从离散颜色列表中创建线性颜色图,并提取基础RGB值。我已经设法使用matplotlib文档中的示例脚本执行第一步。

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

colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1)]
colormap = LinearSegmentedColormap.from_list('colormapX', colors, N=100)

x = np.arange(0, np.pi, 0.1)
y = np.arange(0, 2*np.pi, 0.1)
X, Y = np.meshgrid(x, y)
Z = np.cos(X) * np.sin(Y) * 10

fig, ax = plt.subplots()
im = ax.imshow(Z, interpolation='nearest', origin='lower', cmap=colormap)
fig.colorbar(im, ax=ax)
plt.show()

此色彩图基于100种颜色,这些颜色源自原始三种颜色的插值。如何使用这100种颜色的RGB值提取ndarray?

1 个答案:

答案 0 :(得分:1)

不知道它是否可以直接在某个地方使用,或者是否可以要求colormap评估给定值(返回与给定数字相对应的颜色),但是您可以自己制作这个简单的列表情况下:

def color_interpolation(c1, c2, fraction=0.5):
    return ((1.-fraction)*c1[0] + fraction*c2[0],
            (1.-fraction)*c1[1] + fraction*c2[1],
            (1.-fraction)*c1[2] + fraction*c2[2],)

def make_color_interpolation_list(colors, N):
    n_colors = len(colors)
    n_steps_between_colors = N/(n_colors-1)
    fraction_step = 1. / n_steps_between_colors
    color_array = np.zeros((N,3))
    color_index = 0
    while color_index < n_colors-1:
        fraction_index = 0
        while fraction_index < n_steps_between_colors:
            index = color_index*n_steps_between_colors+fraction_index
            color_array[index]= color_interpolation(c1=colors[color_index],
                                    c2=colors[color_index+1],
                                    fraction=fraction_index*fraction_step)
            fraction_index += 1
        color_index += 1
    if index != len(color_array)-1:
        color_array[-1] = colors[-1]
    return color_array