2013-05-30 900 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

相關問題