Я бы подошел к проблеме немного по-другому.В таких случаях, как ваш, я бы всегда рекомендовал пропустить запись легенды при построении с использованием ключевого слова label
.Затем, чтобы использовать выбранные легенды, вы можете использовать get_legend_handles_labels()
, а затем передать необходимые элементы в fig.legend()
.Вам не нужно указывать аргументы handles
и labels
.Но если вы укажете один (как вы сделали для labels
), вам также следует указать другой, иначе вы получите предупреждение
import matplotlib.pyplot as plt
import numpy as np
def plot(x,y,ax):
ax.plot(x,y)
x = np.linspace(0,1,100)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, x, label='0')
ax.plot(x, x**2, label='1')
ax.plot(x, x**3, label='2')
ax.plot(x, x**4, label='3')
ax.legend(loc=1, title='legend 1')
h, l = ax.get_legend_handles_labels()
fig.legend([h[0],h[1]], [l[0], l[1]], loc=2, title="legend 2")
fig.legend([h[0],h[2]], [l[0], l[2]], loc=3, title="legend 3")
plt.show()

Альтернативный подход к ответу на комментарий @gboffi ниже заключается в том, что вы не используете глобальную легенду для извлечения значений.
x = np.linspace(0,1,100)
fig = plt.figure()
ax = fig.add_subplot(111)
l0, = ax.plot(x, x, label='0')
l1, = ax.plot(x, x**2, label='1')
l2, = ax.plot(x, x**3, label='2')
l3, = ax.plot(x, x**4, label='3')
fig.legend([l0, l1], [l0.get_label(), l1.get_label()], loc=2, title="legend 2")
fig.legend([l0, l2], [l0.get_label(), l2.get_label()], loc=3, title="legend 3")
plt.show()