Я хочу построить две диаграммы p ie из двух наборов данных, которые частично перекрываются в метках, например, метки выглядят так:
labels_a = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "Other"]
labels_b = ["one", "two", "four", "three", "six", "eleven", "twelve", "five", "eight", "nine", "Other"]
Так что six
появляется в обеих из них, но в разных позициях, также некоторые ярлыки появляются только в одном наборе. Оба содержат Other
(но в моем реальном случае их может и не быть).
Теперь я хотел бы нарисовать две диаграммы p ie с этими метками и соответствующими данными, в которых одинаковые метки на каждой диаграмме имеют того же цвета, т.е. я хочу, чтобы клин, соответствующий six
, появлялся на обеих диаграммах p ie одного цвета. Также я хотел бы иметь одну легенду со всеми записями для обеих диаграмм p ie.
Это мой код:
import pandas as pd
import os
import matplotlib.pyplot as plt
# define two color sets that differ
colors = plt.get_cmap("Set1").colors + plt.get_cmap("Dark2").colors
alt_colors = plt.get_cmap("Set3").colors + plt.get_cmap("Set2").colors
labels_a = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "Other"]
labels_b = ["one", "two", "four", "three", "six", "eleven", "twelve", "five", "eight", "nine", "Other"]
values_a = [500, 300, 250.0, 221.0, 164.0, 135.0, 111, 110, 100.0, 91.8, 2200]
values_b = [440, 320, 250.0, 220.0, 164.0, 135.0, 120, 100, 90.0, 70, 2200]
fig, axs = plt.subplots(2,1)
cols_a = list(colors[:len(labels_a)]) # choose the first 11 colors for the a-labels
if "Other" in labels_a: # make sure that Other gets the right color
cols_a[labels_a.index("Other")] = colors[-1]
# set a color map for the b-labels:
cols_b = []
for i in labels_b:
if i in labels_a:
cols_b.append(cols_a[labels_a.index(i)])
else:
cols_b.append(alt_colors[labels_b.index(i)])
if "Other" in labels_b: # make sure that Other gets the same color
cols_b[labels_b.index("Other")] = colors[-1]
wedges_a, text_a = axs[0].pie(values_a, labels=labels_a, colors=cols_a, startangle=-90)
wedges_b, text_b = axs[1].pie(values_b, colors=cols_b, labels= labels_b, startangle=-90)
plt.legend(wedges_a, labels_a, loc="lower right")
Он хорошо работает, так как назначает правильные цвета каждый ярлык. Как мне добиться легенды, в которой есть все записи? И как я могу разместить его вне графиков p ie, то есть, чтобы избежать такого наложения: