Сохранить легенду Matplotlib как отдельное изображение - PullRequest
3 голосов
/ 18 марта 2020

Я прошел по следующей ссылке до публикации вопроса.

Получить легенду как отдельную картинку в Matplotlib

Я не могу скопировать предоставленное решение для моего пример.

Вот мой фрейм данных и код. Я хочу сохранить легенду как отдельное изображение.

df=pd.DataFrame(index=['A','B','C','D'], columns=['Values'])
df['Values'] = [0.45,0.28,0.21,0.3]

fig=plt.figure(figsize=(8,8))
ax1 = plt.subplot(121, aspect='equal')
df['Values'].dropna().plot(kind='pie', autopct='%1.0f%%', startangle=220, labels=None, 
                           colors=['#002c4b','#392e2c','#92847a','#ccc2bb','#6b879d'])

patches, labels = ax1.get_legend_handles_labels()
pp = ax1.legend(patches, labels=df.index, loc='center right', bbox_to_anchor=(0, 0.5), 
              fontsize=8, frameon=False, labelspacing=4)
ax1.axis('off')
plt.ylabel('')
img_name = 'unit1.png'   
plt.savefig(img_name,bbox_inches='tight', dpi = 300)
plt.close(fig)

Пожалуйста, предложите путь вперед.

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Каким-то образом интерфейс pandas для matplotlib, похоже, портит вызов get_legend_handles_labels. Приведенный ниже код эквивалентен тому, что вы написали, но вместо этого использует интерфейс matplotlib.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(index=['A','B','C','D'], columns=['Values'])
df['Values'] = [0.45, 0.28, 0.21, 0.3]

fig, ax = plt.subplots()
ax.pie(df["Values"].dropna(), 
       colors=['#002c4b', '#392e2c', '#92847a', '#ccc2bb', '#6b879d'], 
       autopct='%1.0f%%',
       startangle=220,
       labels=df.index,)
ax.legend(loc="best")

# get handles and labels for reuse
label_params = ax.get_legend_handles_labels() 

figl, axl = plt.subplots()
axl.axis(False)
axl.legend(*label_params, loc="center", bbox_to_anchor=(0.5, 0.5), prop={"size":50})
figl.savefig("LABEL_ONLY.png")

Возможно, вам придется поиграться с figaspect и prop, чтобы получить оптимальные результаты для размера метки и позиционирование.

0 голосов
/ 18 марта 2020

Вы не создаете отдельный экземпляр фигуры для использования для рисования легенды, как это делает принятый ответ в связанном вопросе. Вам нужно что-то вроде этого

df=pd.DataFrame(index=['A','B','C','D'],columns=['Values'])
df['Values']=[0.45,0.28,0.21,0.3]

fig = plt.figure(figsize=(8,8))
figlegend = plt.figure(figsize=(3,2))

# fig.subplot adds subplot to fig instead of to the 'current figure' like plt.subplot
ax1 = fig.subplot(121, aspect='equal')
df['Values'].dropna().plot(kind='pie', autopct='%1.0f%%', startangle=220, labels=None, 
                           colors=['#002c4b','#392e2c','#92847a','#ccc2bb','#6b879d'])

patches, labels = ax1.get_legend_handles_labels()
# Get rid of the legend on the first plot, so it is only drawn on the separate figure
ax1.get_legend().remove()  
figlegend.legend(patches, labels=df.index)

fig.savefig('image.png')
figlegend.savefig('legend.png')
plt.close(fig)
plt.close(figlegend)

Это создаст два отдельных экземпляра рисунка, один для построения графика и второй для легенды, что позволит сохранить их в виде отдельных файлов.

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