Wenn Sie einen Matplotlib-Datenrahmen so wie er ist mit einem hierarchischen Index zeichnen, werden die Achsenbeschriftungen als Taples angezeigt, was etwas enttäuschend ist.
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
a = pd.DataFrame(np.random.random([6, 2]),
index=pd.MultiIndex.from_product([['group1', 'group2'],['item1', 'item2', 'item3']]),
columns=['data1', 'data2'])
a.plot.bar()
Ich wollte eine Achsenbeschriftung hinzufügen, die es leicht macht zu erkennen, dass die Daten eine hierarchische Struktur haben, aber vorerst scheint es, dass dies mit der folgenden Methode durchgeführt werden kann.
def set_hierarchical_xlabels(index, ax=None,
bar_xmargin=0.1, #Ränder am linken und rechten Ende der Linie, X-Achsen-Skala
bar_yinterval=0.1, #Relativer Wert mit dem vertikalen Abstand der Linie und der Länge der Y-Achse als 1?
):
from itertools import groupby
from matplotlib.lines import Line2D
ax = ax or plt.gca()
assert isinstance(index, pd.MultiIndex)
labels = ax.set_xticklabels([s for *_, s in index])
for lb in labels:
lb.set_rotation(0)
transform = ax.get_xaxis_transform()
for i in range(1, len(index.codes)):
xpos0 = -0.5 #Koordinaten auf der linken Seite der Zielgruppe
for (*_, code), codes_iter in groupby(zip(*index.codes[:-i])):
xpos1 = xpos0 + sum(1 for _ in codes_iter) #Koordinaten auf der rechten Seite der Zielgruppe
ax.text((xpos0+xpos1)/2, (bar_yinterval * (-i-0.1)),
index.levels[-i-1][code],
transform=transform,
ha="center", va="top")
ax.add_line(Line2D([xpos0+bar_xmargin, xpos1-bar_xmargin],
[bar_yinterval * -i]*2,
transform=transform,
color="k", clip_on=False))
xpos0 = xpos1
a.plot.bar()
set_hierarchical_xlabels(a.index)
Ich denke, dass sich das detaillierte Design je nach Zweck und Geschmack ändern wird. Es ist also in Ordnung, wenn Sie es entsprechend den obigen Angaben ändern. Sie können auch mit MultiIndex 3 oder mehr Ebenen zeichnen.
Recommended Posts