Python-使用matplotlib创建自己的颜色图并绘制颜色比例

发布于 2021-02-02 23:15:45

我遇到以下问题,我想创建自己的颜色图(红色-混合-紫色-混合-蓝色),将其映射到-2到+2之间的值,并想用它来绘制绘图中的点。然后该图应具有右侧的色标。

到目前为止,这就是我创建地图的方式。但是我不确定是否混合颜色。

cmap = matplotlib.colors.ListedColormap(["red","violet","blue"], name='from_list', N=None)
m = cm.ScalarMappable(norm=norm, cmap=cmap)

这样,我将颜色映射到值。

colors = itertools.cycle([m.to_rgba(1.22), ..])

然后我将其绘制:

for i in range(0, len(array_dg)):
  plt.plot(array_dg[i], markers.next(),alpha=alpha[i], c=colors.next())

我的问题是:
1.我无法绘制色标。
2.我不确定我的色标是否正在创建连续的(平滑的)色标。

关注者
0
被浏览
108
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    这里有一个有关如何创建自定义颜色图的说明性示例。文档字符串对于理解的含义至关重要 cdict。一旦掌握了这一点,就可以使用cdict如下代码:

    cdict = {'red':   ((0.0, 1.0, 1.0), 
                       (0.1, 1.0, 1.0),  # red 
                       (0.4, 1.0, 1.0),  # violet
                       (1.0, 0.0, 0.0)), # blue
    
             'green': ((0.0, 0.0, 0.0),
                       (1.0, 0.0, 0.0)),
    
             'blue':  ((0.0, 0.0, 0.0),
                       (0.1, 0.0, 0.0),  # red
                       (0.4, 1.0, 1.0),  # violet
                       (1.0, 1.0, 0.0))  # blue
              }
    

    尽管该cdict格式为你提供了很大的灵活性,但我发现对于简单的渐变,其格式相当不直观。这是一个实用程序函数,可帮助生成简单的LinearSegmentedColormaps

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.colors as mcolors
    
    
    def make_colormap(seq):
        """Return a LinearSegmentedColormap
        seq: a sequence of floats and RGB-tuples. The floats should be increasing
        and in the interval (0,1).
        """
        seq = [(None,) * 3, 0.0] + list(seq) + [1.0, (None,) * 3]
        cdict = {'red': [], 'green': [], 'blue': []}
        for i, item in enumerate(seq):
            if isinstance(item, float):
                r1, g1, b1 = seq[i - 1]
                r2, g2, b2 = seq[i + 1]
                cdict['red'].append([item, r1, r2])
                cdict['green'].append([item, g1, g2])
                cdict['blue'].append([item, b1, b2])
        return mcolors.LinearSegmentedColormap('CustomMap', cdict)
    
    
    c = mcolors.ColorConverter().to_rgb
    rvb = make_colormap(
        [c('red'), c('violet'), 0.33, c('violet'), c('blue'), 0.66, c('blue')])
    N = 1000
    array_dg = np.random.uniform(0, 10, size=(N, 2))
    colors = np.random.uniform(-2, 2, size=(N,))
    plt.scatter(array_dg[:, 0], array_dg[:, 1], c=colors, cmap=rvb)
    plt.colorbar()
    plt.show()
    

    顺便说一下 for-loop

    ```
    for i in range(0, len(array_dg)):

    plt.plot(array_dg[i], markers.next(),alpha=alpha[i], c=colors.next())
    ```

    每次致电都会画一个点plt.plot。这仅适用于少数几个点,但是对于许多点将变得极其缓慢。plt.plot只能绘制一种颜色,但plt.scatter可以为每个点分配不同的颜色。因此,plt.scatter是要走的路。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看