2016-12-04 41 views
0

給定具有多個屬性的DataFrame。我想在樹的意義上標註條形圖的刻度。我希望下面的例子和ASCII藝術清楚:用屬性樹標註條形圖

import pandas as pd 
import matplotlib.pyplot as plt 

data = [ 
    ('foo', 'qux', 2, 2), 
    ('bar', 'corge', 1, 3), 
    ('foo', 'corge', 3, 2), 
    ('bar', 'qux', 2, 3), 
] 

df = pd.DataFrame(data, columns=('A', 'B', 'U', 'V')) 

df.plot.barh(stacked=True) 
plt.gca().set_yticklabels(df.A + ' ' + df.B) 

# Should be 
# 
# foo/qux  |##@@ 
#  \ corge |###@@ 
# bar/qux  |##@@@ 
#  \ corge |#@@@ 

實際的數據由三個屬性/樹從因實驗水平。

回答

1

下面是使用較小的ticklabels達到預期結果的建議方式:

import pandas as pd 
import matplotlib.pyplot as plt 
from matplotlib import ticker 

data = [ 
    ('foo', 'qux', 2, 2), 
    ('bar', 'corge', 1, 3), 
    ('foo', 'corge', 3, 2), 
    ('bar', 'qux', 2, 3), 
] 

df = pd.DataFrame(data, columns=('A', 'B', 'U', 'V')) 

df = df.set_index(['A','B']) 
df.sort_index(inplace=True) 
# Remove the index names for the plot, or it'll be used as the axis label 
df.index.names = ['',''] 

ax = df.plot(kind='barh', stacked=True) 

minor_locator = ticker.AutoMinorLocator(2) 

ax.yaxis.set_minor_locator(minor_locator) 
ax.set_yticklabels(df.index.get_level_values(1)) 
ax.set_yticklabels(df.index.get_level_values(0).unique(), minor=True) 
ax.set_yticks(np.arange(0.5, len(df), 2), minor=True) 
ax.tick_params(axis='y', which='minor', direction='out', pad=50) 

plt.show() 

Bar chart with multiple levels of tick labels

+0

謝謝,這是一個好主意。你也有任何想法如何可以擴展到三個層面? – Zulan

+0

你也可以把它們全部作爲主要的滴答標籤,然後迭代並使用set_y來抵消其中的一些。或者創建一個輔助y軸並使用它。 –