使用matplotlib创build自己的色彩地图并绘制色彩比例

我有以下问题,我想创build我自己的颜色映射(红色混合紫罗兰色混合蓝色),映射到-2和+2之间的值,并希望使用它来为我的情节着色点。 那么情节应该有右边的色彩比例。

这就是我迄今为止创build地图的方式。 但我不确定它是否混合了颜色。

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()) 

我的问题是:
我无法绘制色阶。
2.我不完全确定,如果我的规模是创造一个连续(光滑)的色彩。

这里有一个说明如何创build自定义颜色映射的例子。 文档string对于理解cdict的含义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格式给了你很大的灵活性,但我发现对于简单的渐变,它的格式是相当不直观的。 这里有一个实用的function来帮助生成简单的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调用绘制一个点。 这将会为less数点工作,但是对于许多点来说会变得非常慢。 plt.plot只能绘制一种颜色,但plt.scatter可以为每个点分配不同的颜色。 因此, plt.scatter是要走的路。

如果要自动创build通常用于曲面图的自定义发散色彩表格,则此模块与@unutbu方法结合起来效果很好。

 def diverge_map(high=(0.565, 0.392, 0.173), low=(0.094, 0.310, 0.635)): ''' low and high are colors that will be used for the two ends of the spectrum. they can be either color strings or rgb color tuples ''' c = mcolors.ColorConverter().to_rgb if isinstance(low, basestring): low = c(low) if isinstance(high, basestring): high = c(high) return make_colormap([low, c('white'), 0.5, c('white'), high]) 

高值和低值可以是string颜色名称或rgb元组。 这是使用曲面图演示的结果: 在这里输入图像描述

由于其他答案中使用的方法似乎相当复杂,这是一个新的答案:

可以使用LinearSegmentedColormap代替生成离散LinearSegmentedColormap 。 这可以使用from_list方法从列表中轻松创build。

 import numpy as np import matplotlib.pyplot as plt import matplotlib.colors x,y,c = zip(*np.random.rand(30,3)*4-2) cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", ["red","violet","blue"]) plt.scatter(x,y,c=c, cmap=cmap) plt.colorbar() plt.show() 

在这里输入图像描述