1

这是对这个答案的跟进。

从答案来看,matplotlib cmap 的定义如下:

cdict = {'red': ((0.0, 1.0, 1.0),
                 (1.0, 1.0, 1.0)),

    'green': ((0.0, 1.0, 1.0),
              (1.0, 0.0, 0.0)),

    'blue': ((0.0, 1.0, 1.0),
             (1.0, 0.0, 0.0))}

my_cmap = mpl.colors.LinearSegmentedColormap('my_colormap', cdict)

我正在努力理解这些数字与颜色过渡的关系。

每个条目中的“行”和“列”有cdict什么作用?

您是否应该想象红色、绿色和蓝色cdict条目相互堆叠?

4

1 回答 1

0

pylab_examples 示例代码中:custom_cmap.py已经解释得很好。让我为你解释,如果我错了,请纠正我。

第一列代表位置“x”,第二和第三列代表色标。

现在考虑你的例子。这是不连续的情况,意味着第二列和第三列是相同的。cdict['green'] 是说对于 0 <= x <= 1,0(第一列),y(第二和第三列)是 0(无绿色)到 1(全绿),表示 x = 处的全绿在 x = 1.0 时 0.0 到没有绿色。在位置 x = 1.0,全红 + 全绿 + 全蓝 = 白色。

cdict = {'red': ((0.0, 1.0, 1.0),
                 (1.0, 1.0, 1.0)),

        'green': ((0.0, 1.0, 1.0),
                  (1.0, 0.0, 0.0)),

        'blue': ((0.0, 1.0, 1.0),
                 (1.0, 0.0, 0.0))}

如果存在不连续性,则情况会稍微复杂一些。

将给定颜色的 cdict 条目中每一行中的 3 个元素标记为 (x, y0, y1)。然后对于 x[i] 和 x[i+1] 之间的 x 值,颜色值被插值在 y1[i] 和 y0[i+1] 之间。

回到食谱示例,看看 cdict['red']; 因为 y0 != y1,所以对于 x 从 0 到 0.5,红色从 0 增加到 1,但随后它向下跳,因此对于 x 从 0.5 到 1,红色从 0.7 增加到 1。绿色从 0 上升当 x 从 0 变为 0.5 时变为 1,然后跳回 0,并在 x 从 0.5 变为 1 时逐渐回到 1。

row i:   x  y0  y1
                /
               /
row i+1: x  y0  y1

例如:

cdict = {'red': ((0.0, 1.0, 1.0), # y[1,3] to y[2,2] is full red from position of 0.0 to 1.0.
                 (0.5, 1.0, 0.0), 
                 (1.0, 1.0, 1.0)), 

        'green': ((0.0, 1.0, 1.0),
                  (0.5, 0.0, 0.0), 
                  (1.0, 1.0, 1.0)), 

        'blue': ((0.0, 1.0, 1.0),
                 (0.5, 0.0, 1.0), 
                 (1.0, 1.0, 1.0))} 

在此处输入图像描述

于 2017-12-15T16:28:36.970 回答