2014-09-26 27 views
1

我試圖讓一個圖具有與默認不同的顏色映射。 dark2色彩映射對於我的數據來說看起來是最好的,但它都是用默認的顏色出來的。我錯過了什麼?將規範化的標量顏色映射應用於matplotlib圖,仍然獲取默認顏色

import matplotlib 
import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 
from pylab import get_cmap 

data = [{'a': 1, 'b': 1, 'c': 2, 'd': 0},{'a': 1, 'b': 1, 'c': 2, 'd': 0}, 
     {'a': 1, 'b': 1, 'c': 1, 'd': 2},{'a': 1, 'b': 2.5, 'c': 1, 'd': 2}, 
     {'a': 1.7, 'b': 2.1, 'c': 2, 'd': 0.2},{'a': 1.7, 'b': 2.1, 'c': 2, 'd': 0.2}] 
cm = get_cmap('Dark2') 

cnorm = matplotlib.colors.Normalize(vmin=0, vmax=len(data)) 
smap = matplotlib.cm.ScalarMappable(norm=cnorm, cmap=cm) 
_fig, ax = plt.subplots(1, 1, figsize=(18, 8)) 
for lx in range(len(ax.axes.lines)): 
    ax.axes.lines[lx].set_color(smap.to_rgba(lx)) 
    print('setting color for %i to %s' % (lx, smap.to_rgba(lx))) 

frm = pd.DataFrame(data) 
frm.plot(ax=ax) 

plt.show() 
+0

您的示例代碼應該很簡單並且可以運行。就目前而言,我無法對這段代碼做任何事情(沒有導入,未定義的變量等)。 – 2014-09-26 22:16:44

+0

另外,我認爲'ax.axes.lines'將是空的,因爲你還沒有繪製任何東西,然後當你實際繪製某些東西時,你不會(明顯地)傳遞任何顏色參數。 – 2014-09-26 22:20:20

+0

不填充數據,但更多的代碼存在。一起工作的數據= 這是合理的。 – Mike 2014-09-26 22:52:09

回答

1

您正在將顏色設置爲空列表。只需移動代碼即可:

import matplotlib 
import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 

%matplotlib inline 

data = [ 
    {'a': 1, 'b': 1, 'c': 2, 'd': 0}, 
    {'a': 1, 'b': 1, 'c': 2, 'd': 0}, 
    {'a': 1, 'b': 1, 'c': 1, 'd': 2}, 
    {'a': 1, 'b': 2.5, 'c': 1, 'd': 2}, 
    {'a': 1.7, 'b': 2.1, 'c': 2, 'd': 0.2}, 
    {'a': 1.7, 'b': 2.1, 'c': 2, 'd': 0.2} 
] 
cm = matplotlib.cm.Dark2 

cnorm = matplotlib.colors.Normalize(vmin=0, vmax=len(data)) 
smap = matplotlib.cm.ScalarMappable(norm=cnorm, cmap=cm) 
_fig, ax = plt.subplots(1, 1, figsize=(18, 8)) 

frm = pd.DataFrame(data) 
frm.plot(ax=ax, legend=False) # legend=False b/c we haven't tweaked colors yet 

for lx in range(len(ax.axes.lines)): 
    ax.axes.lines[lx].set_color(smap.to_rgba(lx)) 

    # now this will actually print something 
    print('setting color for %i to %s' % (lx, smap.to_rgba(lx))) 

ax.legend() # and now do the legend 
+0

謝謝。我不應該在生病時寫代碼(讓你的流感疫苗開始!) – Mike 2014-09-26 23:42:41