2017-04-21 196 views
14

以下代码仅显示主类别['one','two','three','four','five','six']作为x轴标签。有一种方法显示子类别['A','B','C','D']作为辅助x轴标签吗? enter image description here具有多个标签的条形图

df = pd.DataFrame(np.random.rand(6, 4), 
       index=['one', 'two', 'three', 'four', 'five', 'six'], 
       columns=pd.Index(['A', 'B', 'C', 'D'], 
       name='Genus')).round(2) 


df.plot(kind='bar',figsize=(10,4)) 
+0

我能想到的两种选择:1.下面主之一创建自组织二次X轴(见[此](http://stackoverflow.com/questions/31803817/how-to-add-second-x-axis-the-the-the-the-one-the-one-in-matplotlib)); 2.从'df.unstack()。plot.bar()'开始,然后更改图形属性。 – VinceP

回答

7

这里一个可能的解决方案(我上过很多很多的乐趣!):

df = pd.DataFrame(np.random.rand(6, 4), 
       index=['one', 'two', 'three', 'four', 'five', 'six'], 
       columns=pd.Index(['A', 'B', 'C', 'D'], 
       name='Genus')).round(2) 

ax = df.plot(kind='bar',figsize=(10,4), rot = 0) 

# "Activate" minor ticks 
ax.minorticks_on() 

# Get location of the center of each rectangle 
rects_locs = map(lambda x: x.get_x() +x.get_width()/2., ax.patches) 
# Set minor ticks there 
ax.set_xticks(rects_locs, minor = True) 


# Labels for the rectangles 
new_ticks = reduce(lambda x, y: x + y, map(lambda x: [x] * df.shape[0], df.columns.tolist())) 
# Set the labels 
from matplotlib import ticker 
ax.xaxis.set_minor_formatter(ticker.FixedFormatter(new_ticks)) #add the custom ticks 

# Move the category label further from x-axis 
ax.tick_params(axis='x', which='major', pad=15) 

# Remove minor ticks where not necessary 
ax.tick_params(axis='x',which='both', top='off') 
ax.tick_params(axis='y',which='both', left='off', right = 'off') 

这里就是我得到:

enter image description here

8

这里是一个解决方案。你可以得到酒吧的位置,并相应地设置一些小的xticklabels。

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

df = pd.DataFrame(np.random.rand(6, 4), 
       index=['one', 'two', 'three', 'four', 'five', 'six'], 
       columns=pd.Index(['A', 'B', 'C', 'D'], 
       name='Genus')).round(2) 


df.plot(kind='bar',figsize=(10,4)) 

ax = plt.gca() 
pos = [] 
for bar in ax.patches: 
    pos.append(bar.get_x()+bar.get_width()/2.) 


ax.set_xticks(pos,minor=True) 
lab = [] 
for i in range(len(pos)): 
    l = df.columns.values[i//len(df.index.values)] 
    lab.append(l) 

ax.set_xticklabels(lab,minor=True) 
ax.tick_params(axis='x', which='major', pad=15, size=0) 
plt.setp(ax.get_xticklabels(), rotation=0) 

plt.show() 

enter image description here

相关问题