【问题标题】:Custom Colormap in PythonPython中的自定义颜色图
【发布时间】:2015-12-08 01:46:50
【问题描述】:

我想在python中创建自己的自定义颜色图,我查看了一些在线示例并找到了命令

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

cdict1 = {'red':   ((0.0, 0.0, 0.0),
                    (0.5, 0.0, 0.1),
                    (1.0, 1.0, 1.0)),

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

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

blue_red1 = LinearSegmentedColormap('BlueRed1', cdict1)
plt.imshow(big,interpolation='nearest',  cmap=blue_red1, aspect='auto')
plt.colorbar()
plt.show()

使用上面的命令,我得到一个颜色图,它是(红 - 黑 - 蓝),其中红色是最大的,蓝色是最小的。我想创建一个(黑 - 白 - 黑)的颜色图。有人可以告诉我应该做什么或任何其他方法吗?

【问题讨论】:

    标签: python matplotlib colormap


    【解决方案1】:

    您希望所有三个分量在 0 和 1 处都为 0,并且所有三个分量在 0.5 处都为 1。 所以,你有:

    cdict1 = {'red':  ((0.0, 0.0, 0.0),   # <- at 0.0, the red component is 0
                       (0.5, 1.0, 1.0),   # <- at 0.5, the red component is 1
                       (1.0, 0.0, 0.0)),  # <- at 1.0, the red component is 0
    
             'green': ((0.0, 0.0, 0.0),   # <- etc.
                       (0.5, 1.0, 1.0),
                       (1.0, 0.0, 0.0)),
    
             'blue':  ((0.0, 0.0, 0.0),
                       (0.5, 1.0, 1.0),
                       (1.0, 0.0, 0.0))
             }
    

    【讨论】:

      【解决方案2】:

      我还发现颜色图创建令人困惑。 LinearSegmentedColormap 很好,因为它非常灵活,但 cdict 需要一些时间来适应。

      以这种方式制作颜色图的第一件事——也许也是最重要的——是你了解RGB colors。基本上,每种颜色都有一个从 0 到 1 的强度值,更高的值会提供更多的颜色。在RGB色彩空间中,白色由所有三种颜色1表示,黑色由所有三种颜色0表示。

      学习以这种方式制作颜色图的第二个重要事项是:始终使每个元组的第二个和第三个值相同,直到您熟悉创建简单的线性颜色图。最终,您可以更改这些值以在颜色图中产生不连续性,但这只会让您在开始时感到困惑。

      好的,所以每个元组中的第一个值是颜色图的“分数”,这些值必须从 0 到 1,第二个和第三个值是该颜色的强度(下限和上限)。因此,要制作一个“黑-白-黑”的颜色图,您可以:

      cdict1 = {
          'red':   ((0.0, 0.0, 0.0),
                    (0.5, 1.0, 1.0),
                    (1.0, 0.0, 0.0)),
      
          'green': ((0.0, 0.0, 0.0),
                    (0.5, 1.0, 1.0),
                    (1.0, 0.0, 0.0)),
      
          'blue':   ((0.0, 0.0, 0.0),
                    (0.5, 1.0, 1.0),
                    (1.0, 0.0, 0.0)),
               }
      
      black_white_black = LinearSegmentedColormap('BlackWhiteBlack', cdict1)
      

      例如,

      plt.imshow(np.arange(100).reshape(10,10), cmap=black_white_black, aspect='auto')
      plt.colorbar()
      

      祝你好运!

      【讨论】:

        【解决方案3】:

        试试 cdict1 的

        cdict1 = {'red':   ((0.0, 0.0, 0.0),
                            (0.5, 1.0, 1.0),
                            (1.0, 0.0, 0.0)),
        
                 'green': ((0.0, 0.0, 0.0),
                           (0.5, 1.0, 1.0),
                           (1.0, 0.0, 0.0)),
        
                 'blue':  ((0.0, 0.0, 0.0),
                           (0.5, 1.0, 1.0),
                           (1.0, 0.0, 0.0))
                 }
        

        这本词典描述了颜色是如何插值的,分别查看每个红-绿-蓝分量。对于每个组件,您给它一个 3 元组 (x, y0, y1) 的列表,指定如何插入该组件,并且您想要的每个值都插入到列表中的两个点之间。

        在这种情况下,我们要从黑色 [RGB=(0,0,0)] 开始,在数据范围的中点处增加到白色 [RGB=1,1,1],然后再减小到最后是黑色的。

        对于要分配颜色的每个值,地图将首先将该值转换为输入范围的一部分,以便它具有范围 [0, 1] 内的内容。为了获得红色组件的级别,地图将扫描“红色”列表中每个 3 元组中的第一个元素,并获取不超过您分数的最大元素。分配的红色级别将根据 x 值的差异在该 3 元组的 y1 元素和下一个 3 元组的 y0 元素之间进行插值。

        蓝色和绿色成分也是如此。

        【讨论】:

          【解决方案4】:

          对于它的价值,还有一种更简单的方法。

          LinearSegmentedColormap 的完整形式使您能够在同一个颜色图中拥有“硬”停止和渐变,因此它必然很复杂。但是,对于您所描述的简单情况,有一个方便的构造函数。

          import numpy as np
          import matplotlib.pyplot as plt
          from matplotlib.colors import LinearSegmentedColormap
          
          cmap = LinearSegmentedColormap.from_list('mycmap', ['black', 'white', 'black'])
          
          fig, ax = plt.subplots()
          im = ax.imshow(np.random.random((10, 10)), cmap=cmap, interpolation='nearest')
          fig.colorbar(im)
          plt.show()
          

          【讨论】:

            猜你喜欢
            • 2019-03-08
            • 2017-02-25
            • 2019-03-17
            • 1970-01-01
            • 2019-06-17
            • 2021-05-03
            • 2022-08-19
            • 2021-12-02
            • 2016-11-04
            相关资源
            最近更新 更多