Могу ли я поделиться легендами о нескольких сюжетах панд в разных осях? - PullRequest
1 голос
/ 18 октября 2019

Я хотел бы построить многоуровневые столбчатые столбцы по разным осям, используя Pandas и matplotlib

Проблема со следующим минимальным примером заключается в том, что он создает легенду для каждой оси.

import pandas as pd
import matplotlib.pyplot as plt

d1 = {'a': 1, 'b': 10}
d2 = {'a': 5, 'b': 5}
df = pd.DataFrame([d1,d2])
d1 = {'a': 9, 'b': 3}
d2 = {'a': 5, 'b': 4}
df2 = pd.DataFrame([d1,d2])

fig, axes = plt.subplots(2,1,sharex=True)
df.plot.barh(stacked=True,ax=axes[0])
axes[0].set_ylabel('DataFrame 1')
df2.plot.barh(stacked=True,ax=axes[1])
axes[1].set_ylabel('DataFrame 2')

enter image description here

Есть ли способ поделиться легендой для всех осей? Может ли легенда быть перемещена за пределы области черчения? Legens, вероятно, довольно большой.

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Да, если все легенды одинаковы, вы можете взять одну из них и поместить ее на plt:

# grab the legend handles and lables
h, l = axes[0].get_legend_handles_labels()

# remove all the subplot legends
for ax in axes: ax.get_legend().remove()

# add one legend on `plt`
plt.legend(h,l, loc=(1.05, 0.8))

Вывод:

enter image description here

2 голосов
/ 18 октября 2019

Отключить легенду для второго сюжета и установить положение первого

fig, axes = plt.subplots(2,1,sharex=True)
df.plot.barh(stacked=True,ax=axes[0]).legend(bbox_to_anchor=(1.01, 1), loc='upper left')
axes[0].set_ylabel('DataFrame 1')
df2.plot.barh(stacked=True,ax=axes[1], legend=False)
axes[1].set_ylabel('DataFrame 2')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...