回答问题

我有以下问题,我想创建自己的颜色图(red-mix-violet-mix-blue),它映射到 -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\。我不完全确定我的比例是否正在创建连续(平滑)的颜色比例。

Answers

这里有一个如何创建自定义颜色图的说明性示例。文档字符串对于理解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是要走的路。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐