Я думал, что это функциональное решение от @ jrj c довольно озадачивает мое понимание, и поэтому я предпочел немного изменить свою вещь и настроить ее.
Так Мне потребовалось некоторое время, чтобы понять, что, когда для сюжета создается вторая легенда, python автоматически стирает первую, и в этот момент необходимо использовать add_artist()
.
Другая необходимая предпосылка для добавьте вторую легенду для присвоения имени графику и примените метод .add_artist () к этому заданному c графику, чтобы python знал, куда вставить этот новый фрагмент.
Короче говоря, вот как Мне удалось создать сюжет, который я имел в виду, и я надеюсь, что комментарии сделают его более понятным и полезным для всех.
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap as coloring
import matplotlib.patches as mpatches
# copy the dfs below and use pd.read_clipboard() to reproduce
df_1
A B C D E
Mg 10 15 23 25 27
Ca 30 33 0 20 17
df_2
A B C D E
Mg 20 12 8 40 10
Ca 7 26 12 22 16
hatches=(' ', '//')
colors_ABCDE=['tomato', 'gold', 'greenyellow', 'forestgreen', 'palevioletred']
dfs=[df_1,df_2]
for each_df, df in enumerate(dfs):
#I name the plot as "figure"
figure=df.plot(ax=plt.subplot(111), kind="barh", \
stacked=True, hatch=hatches[each_df], \
colormap=coloring.from_list("my_colormap", colors_ABCDE), \
figsize=(7,2.5), position=len(dfs)-each_df-1, \
align='center', width=0.2, edgecolor="darkgrey", \
legend=False) #I had to False the legend too
legend_1=plt.legend(df_1.columns, loc='center left', bbox_to_anchor=(1.0, 0.5), fontsize=12)
patch_hatched = mpatches.Patch(facecolor='beige', hatch='///', edgecolor="darkgrey", label='hatched')
patch_unhatched = mpatches.Patch(facecolor='beige', hatch=' ', edgecolor="darkgrey", label='non-hatched')
legend_2=plt.legend(handles=[patch_hatched, patch_unhatched], loc='center left', bbox_to_anchor=(1.15, 0.5), fontsize=12)
# as soon as a second legend is made, the first disappears and needs to be added back again
figure.add_artist(legend_1) #python now knows that "figure" must take the "legend_1" along with "legend_2"
Я почти уверен, что он может быть еще более элегантным и автоматизированным.