Барная диаграмма с несколькими ярлыками
Следующий код показывает только основные категории ['one', 'two', 'three', 'four', 'five', 'six'] в качестве меток оси x. Есть ли способ показать подкатегорию ['A', 'B', 'C', 'D'] как вторичные метки оси x?
![введите описание изображения здесь]()
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))
Ответы
Ответ 1
Вот возможное решение (мне было очень весело!):
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')
Вот что я получаю:
![введите описание изображения здесь]()
Ответ 2
Вот решение. Вы можете получить позиции баров и установить некоторые незначительные 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()
![введите описание изображения здесь]()