Pyplot: показывать только первые 3 строки в легенде

Я запускаю симуляцию 200 раз и строю 3 списков вывода как 3 строки с высокой прозрачностью. Это позволяет мне показать разницу между симуляциями.

Проблема в том, что моя легенда показывает 3x200 предметов вместо 3 предметов. Как мне заставить его показывать легенду для каждой строки один раз?

for simulation in range(200):  
    plt.plot(num_s_nodes, label="susceptible", color="blue", alpha=0.02)  
    plt.plot(num_r_nodes, label="recovered", color="green", alpha=0.02)
    plt.plot(num_i_nodes, label="infected", color="red", alpha=0.02)
plt.legend()  
plt.show()

Ответ 1

добавить

plt.plot( ... , label='_nolegend_')

для любого графика, который вы не хотите показывать в легенде. поэтому в вашем коде вы можете, например, сделать:

..., label='_nolegend_' if simulation else 'susceptible', ...

и аналогично для других, или если вам не нравится код iffy:

..., label=simulation and '_nolegend_' or 'susceptible',...

Ответ 2

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

# no show lines for you ledgend
plt.plot([], label="susceptible", color="blue", alpha=0.02)  
plt.plot([], label="recovered", color="green", alpha=0.02)
plt.plot([], label="infected", color="red", alpha=0.02)

for simulation in range(200):
   # your actual lines
   plt.plot(num_s_nodes, color="blue", alpha=0.02)  
   plt.plot(num_r_nodes, color="green", alpha=0.02)
   plt.plot(num_i_nodes, color="red", alpha=0.02)
plt.legend()
plt.show()