Формат легенды теряется после использования: ax.legend(дескрипторы, метки)

У меня та же проблема, что и в этом посте: где пользователь хочет удалить повторяющиеся записи в легенде:

Хватит повторять метки matplotlib в легенде

Ответ работает и для меня, однако, когда я его использую, формат легенды полностью теряется. Это происходит, когда я применяю метод ax.legend (дескрипторы, метки). Следующий код (скопированный с http://matplotlib.org/examples/pylab_examples/legend_demo.html) иллюстрирует эту проблему:

# Example data
a = np.arange(0,3, .02)
b = np.arange(0,3, .02)
c = np.exp(a)
d = c[::-1]

# Create plots with pre-defined labels.
# Alternatively, you can pass labels explicitly when calling `legend`.
fig, ax = plt.subplots()
ax.plot(a, c, 'k--', label='Model length')
ax.plot(a, d, 'k:', label='Data length')
ax.plot(a, c+d, 'k', label='Total message length')

# Now add the legend with some customizations.
legend = ax.legend(loc='upper center', shadow=True)

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels )   

# The frame is matplotlib.patches.Rectangle instance surrounding the legend.
frame = legend.get_frame()
frame.set_facecolor('0.90')

# Set the fontsize
for label in legend.get_texts():
    label.set_fontsize('large')

for label in legend.get_lines():
    label.set_linewidth(1.5)  # the legend line width
plt.show()

Результат без использования 'ax.legend(ручки, метки)':введите описание изображения здесь

Результат, используя 'ax.legend(ручки, метки)':введите описание изображения здесь

Любой совет будет приветствоваться

РЕДАКТИРОВАТЬ 1: Исправлена ​​опечатка "без"

1 ответ

Решение

Вы выпустили legend() вызовите дважды, и во второй раз он вызывается без форматирования аргументов, замените:

legend = ax.legend(loc='upper center', shadow=True)

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels )

с

handles, labels = ax.get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))
ax.legend(by_label.values(), by_label.keys(), loc='upper center', shadow=True)

Должен сделать свое дело.

Другие вопросы по тегам