2013-05-30 905 views
30

我有以下问题,我想创建自己的colormap(红色混合紫色混合蓝色),它映射到-2和+2之间的值并且想要使用它在我的情节中给点颜色。 该图应该具有右侧的色彩比例。

这就是我如何创建地图。但我不确定它是否混合了颜色。使用matplotlib创建自己的colormap并绘制颜色比例

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

你能澄清你的问题一点?例如,'c ='指定线条的颜色,而你正在谈论点。你只能指定一个'markerfacecolor',如果你真的想要分数,分散可能是一个更好的选择。确实列出了“ListedColormap”,而不是连续的,参见'LinearSegmentedColormap'。 –

+0

这很奇怪,它应该是点,它看起来像点。 – Trollbrot

+0

你可以偏离过去,但那就是你应该澄清的。我们无法看到您正在使用的情节风格。如果你使用'plt.plot(values,'o')',你将只绘制标记而不绘制线条,但是标记将会有一个固定的颜色,它不会随着值的变化而变化。 –

回答

53

有一个说明性的例子how to create custom colormaps here。 文档字符串对于理解 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() 

enter image description here


顺便说一句,在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是要走的路。

+0

现在我遇到了问题。我也想根据颜色获得不同的标记符号(我有13种不同的颜色)。但散点图只允许每个标记一个标记,或者我错过了什么? – Trollbrot

+0

在这种情况下,您需要为每个颜色/标记组合调用一次'plt.scatter'(或'plt.plot')。 – unutbu

+0

为什么我不能在plt.set_cmap()中使用用这个真棒函数创建的颜色贴图?错误非常长,最后一行是ValueError:ColorMap CustomMap无法识别。 – Phlya

10

如果您想自动创建通常用于surface plots的自定义发散色彩映射表,则此模块与@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]) 

高和低值可以是字符串颜色名称或rgb元组。这是使用surface plot demo结果: enter image description here

+0

非常整齐的功能! – Thriveth

6

由于在其他的答案中使用的方法似乎是这样简单的任务相当复杂的,这里是一个新的答案:

一个ListedColormap的相反,其产生的离散色彩地图,您可以使用LinearSegmentedColormap。这可以使用from_list方法从列表中轻松创建。

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

enter image description here

+0

你现在将如何传递一个自己定义的范围,例如: 'red'对应于'-5','violet'到'1'和'blue'到'100'?我非常感谢,如果你可以看看我问的问题[这里](https://stackoverflow.com/questions/47697782/how-to-create-a-customized-colormap-and-use-it-for-不同范围,-的数据)。 – Cleb

+1

使用相应绘图方法的'vmin'和'vmax'或'norm'参数。 – ImportanceOfBeingErnest

相关问题