легенда в matplotlib с записями из разных наборов данных - PullRequest
0 голосов
/ 13 апреля 2020

Я хочу построить две диаграммы 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, то есть, чтобы избежать такого наложения:

enter image description here

1 Ответ

0 голосов
/ 13 апреля 2020

В кратком ответе используется bbox_to_anchor вот так (значения - мои оценки, вы должны поиграть с ними и посмотреть, что вам больше подходит):

plt.legend(wedges_a, labels_a, loc="lower right", bbox_to_anchor=(2,0.5))

Существует гораздо больше информации о bbox_to_anchor в этот замечательный ответ .

Кстати, я бы также порекомендовал увеличить размер вашей фигуры - вот так:

fig, axs = plt.subplots(2,1, figsize=(10, 10))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...