2017-06-15 82 views
2

大熊貓數據框有以下形式,其中Year是指數:副標題在matplotlib傳說與類別的定義子集和堆疊情節

 A:Cat1 A:Cat2 B:Cat1 B:Cat2 B:Cat3 
Year           
1977  0.5 0.25 0.15  0.1  0.1 
1981  0.2  NaN 0.40  0.1  0.2 
1983  0.1 0.10 0.30  0.2  0.3 

重要的是,你有相同類別CAT1和CAT2在兩個不同的「超級類別」A和B中。爲了繪製所有類別的變體,我使用堆疊圖形,併爲每個超類別使用兩種不同的顏色。所有這些顏色保存在列表colors

我在做什麼,現在繪製的圖形是(pltpyplot):

plt.stackplot(data.index.values,data.fillna(0).T.values,colors=colors,labels=data.columns.values) 
plt.legend(loc="best") 

這使得與以前的數據如下:

Result of previous code

現在,我想要做的就是避免在圖例中重複超類別A和B,要麼爲每個超類別創建兩個不同的圖例,要麼通過在同一個圖例中添加子標題。我查看了有關子標題的this other question,但重點是我希望能夠指定圖例兩列之間的中斷點,所以只需指定ncol=2不起作用,因爲它不會在正確的位置中斷,因爲我不會在每個「超級類別」中都沒有相同數量的類別。

回答

1

也許嘗試添加佔位符來處理每個超類別中不相等數量的類別。或使用水平組標籤:

import io 

import pandas as pd 
import matplotlib.lines as mlines 
import matplotlib.patches as mpatches 
import matplotlib.pyplot as plt 

s = """1977 0.5 0.25 0.15 0.1 0.1 
1981 0.2 NaN 0.40 0.1 0.2 
1983 0.1 0.10 0.30 0.2 0.3""" 
t = [('A', 'Cat1'), 
    ('A', 'Cat2'), 
    ('B', 'Cat1'), 
    ('B', 'Cat2'), 
    ('B', 'Cat3')] 
index = pd.MultiIndex.from_tuples(t) 
df = pd.read_table(io.StringIO(s), names=index) 
df.index.name = 'Year' 
colors = ['b', 'c', 'k', 'g', 'w'] 
plt.stackplot(df.index.values,df.fillna(0).T.values,colors=colors) 

ha = mlines.Line2D([], [], marker='None', linestyle='None') 
hb = mlines.Line2D([], [], marker='None', linestyle='None') 
ha1 = mpatches.Patch(color=colors[0], ec='k') 
ha2 = mpatches.Patch(color=colors[1], ec='k') 
hb1 = mpatches.Patch(color=colors[2], ec='k') 
hb2 = mpatches.Patch(color=colors[3], ec='k') 
hb3 = mpatches.Patch(color=colors[4], ec='k') 
hblank = mpatches.Patch(visible=False) 
l1 = plt.legend([ha, ha1, ha2, hblank, hb, hb1, hb2, hb3], 
       ['A', 'Cat1', 'Cat2', '', 'B', 'Cat1', 'Cat2', 'Cat3'], 
       loc=2, ncol=2) # Two columns, vertical group labels 
l2 = plt.legend([ha, hblank, hb, hblank, hblank, ha1, ha2, hb1, hb2, hb3], 
       ['A', '', 'B', '', '', 'Cat1', 'Cat2', 'Cat1', 'Cat2', 'Cat3'], 
       loc=4, ncol=2) # Two columns, horizontal group labels 

ax = plt.gca() 
ax.add_artist(l1) 
ax.get_xaxis().get_major_formatter().set_useOffset(False) 
plt.show() 

enter image description here

+0

哦,當然,不過這是正確的答案!我沒有想到用空的陰謀和標籤來填充傳說。我也不知道「visible = False」選項存在。非常感謝 ! – baloo