Python Matplotlib - Множественные легенды вторичной оси - PullRequest
1 голос
/ 06 августа 2020

У меня есть сюжет с дополнительной осью. На оси 1 нанесены два набора данных. Ось 2 имеет один набор данных. Я могу получить две легенды (одну из оси 1 и одну из оси 2), как я хочу, - одну под другой за пределами графика справа.

Я хочу, чтобы второй набор данных из оси 1 имел свои легенда НИЖЕ двух вышеуказанных легенд. Но он появляется помимо двух.

Как я могу заставить это работать?

Ниже мой код:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(111)
t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-',label='data1')
ax1.set_xlabel('time (s)')
ax1.legend(loc='lower left', bbox_to_anchor= (1.1, 0.7), ncol=2,
            borderaxespad=0, frameon=False)

ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax2.plot(t, s2, 'r',label='data2')
ax2.legend(loc='lower left', bbox_to_anchor= (1.1, 0.6), ncol=2,
            borderaxespad=0, frameon=False)

data3 = [10000]*len(t)
ax1.plot(t,data3,'k--',label='data3')
ax1.legend(loc='lower left', bbox_to_anchor= (1.1, 0.5), ncol=2,
            borderaxespad=0, frameon=False)

plt.show()

Когда я меняю значения y для bbox_to_anchor, вместо того, чтобы отображаться в столбце с двумя другими легендами, «data3» отображается в строке с одной из двух легенд.

Спасибо

R

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Измените ncol=2 на ncol=1, чтобы ограничить элементы легенды одним столбцом.

import numpy as np
import matplotlib.pyplot as plt

# constrained layout worked best for me, but you can change it back
fig = plt.figure(constrained_layout=True)
ax1 = fig.add_subplot(111)
t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-',label='data1')
ax1.set_xlabel('time (s)')
ax1.legend(loc='lower left', bbox_to_anchor= (1.1, 0.7), ncol=1,
            borderaxespad=0, frameon=False)

ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax2.plot(t, s2, 'r',label='data2')
ax2.legend(loc='lower left', bbox_to_anchor= (1.1, 0.6), ncol=1,
            borderaxespad=0, frameon=False)

data3 = [10000]*len(t)
ax1.plot(t,data3,'k--',label='data3')
ax1.legend(loc='lower left', bbox_to_anchor= (1.1, 0.5), ncol=1,
            borderaxespad=0, frameon=False)

plt.show()

введите описание изображения здесь

0 голосов
/ 06 августа 2020

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

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(111)
t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-',label='data1')
ax1.set_xlabel('time (s)')

ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax2.plot(t, s2, 'r',label='data2')
lh2, l2 = ax2.get_legend_handles_labels()

data3 = [10000]*len(t)
ax1.plot(t,data3,'k--',label='data3')
lh1, l1 = ax1.get_legend_handles_labels()

ax1.legend([lh1[0]]+lh2+[lh1[1]], 
           [l1[0]]+l2+[l1[1]], 
           loc='lower left', 
           bbox_to_anchor= (1.1, 0.4), 
           ncol=1,
           borderaxespad=0, 
           frameon=False)

Вывод:

введите описание изображения здесь

...