2016-04-22 235 views
3

可以將顏色循環設置爲與現有的顏色映射相匹配,但是此問題詢問如何做相反處理:從顏色循環創建定性顏色映射。使用matplotlib的顏色循環作爲顏色映射

在我的具體情況中,我有一個散點圖和一個關聯的整數類標籤數組。我現在的劇情是這樣的:

x,y = np.random.normal(size=(2,250)) 
theta = np.arctan2(y,x) 
c = np.digitize(theta, np.histogram(theta)[1]) 
plt.scatter(x,y,c=c) 

current scatter plot

正如你所看到的,這個沒有做乾淨區分階級的偉大的工作。相反,我想以某種方式插入匹配當前顏色循環的顏色映射,其中標籤i對應於color_cycle[i]。如果我有更多的類比顏色循環有顏色,那很好,它應該像正常一樣環繞。

回答

1

我不認爲存在獲取當前顏色週期一個公共API,而是通過模仿set_prop_cycle可以定義get_prop_cycle這樣:

rcParams = plt.matplotlib.rcParams 
def get_prop_cycle(): 
    prop_cycler = rcParams['axes.prop_cycle'] 
    if prop_cycler is None and 'axes.color_cycle' in rcParams: 
     clist = rcParams['axes.color_cycle'] 
     prop_cycler = cycler('color', clist) 
    return prop_cycler 

一旦你的顏色prop_cycler,您可以在顏色週期圖c將顏色:

colors = [item['color'] for item in get_prop_cycle()] 
c = np.take(colors, c, mode='wrap') 

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.rcsetup import cycler 

np.random.seed(2016) 

rcParams = plt.matplotlib.rcParams 
def get_prop_cycle(): 
    prop_cycler = rcParams['axes.prop_cycle'] 
    if prop_cycler is None and 'axes.color_cycle' in rcParams: 
     clist = rcParams['axes.color_cycle'] 
     prop_cycler = cycler('color', clist) 
    return prop_cycler 

fig, ax = plt.subplots(nrows=2) 
x,y = np.random.normal(size=(2,250)) 
theta = np.arctan2(y,x) 
c = np.digitize(theta, np.histogram(theta)[1]) 

ax[0].scatter(x,y,c=c) 
ax[0].set_title('using default colormap') 

colors = [item['color'] for item in get_prop_cycle()] 
c = np.take(colors, c, mode='wrap') 

ax[1].scatter(x,y,c=c) 
ax[1].set_title('using color cycle') 
plt.show() 

enter image description here

+0

謝謝,這正是我所需要的!我發現使用'c = np.take(colors,c,mode ='wrap')',而不是循環/ islice組合更簡單一些。 – perimosocordiae

+0

@perimosocordiae:感謝您的巨大改進。 – unutbu