[python] Axe secondaire avec twinx (): comment ajouter à la légende?


Answers

Je ne suis pas sûr si cette fonctionnalité est nouvelle, mais vous pouvez également utiliser la méthode get_legend_handles_labels () plutôt que de suivre les lignes et les étiquettes:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('mathtext', default='regular')

pi = np.pi

# fake data
time = np.linspace (0, 25, 50)
temp = 50 / np.sqrt (2 * pi * 3**2) \
        * np.exp (-((time - 13)**2 / (3**2))**2) + 15
Swdown = 400 / np.sqrt (2 * pi * 3**2) * np.exp (-((time - 13)**2 / (3**2))**2)
Rn = Swdown - 10

fig = plt.figure()
ax = fig.add_subplot(111)

ax.plot(time, Swdown, '-', label = 'Swdown')
ax.plot(time, Rn, '-', label = 'Rn')
ax2 = ax.twinx()
ax2.plot(time, temp, '-r', label = 'temp')

# ask matplotlib for the plotted objects and their labels
lines, labels = ax.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax2.legend(lines + lines2, labels + labels2, loc=0)

ax.grid()
ax.set_xlabel("Time (h)")
ax.set_ylabel(r"Radiation ($MJ\,m^{-2}\,d^{-1}$)")
ax2.set_ylabel(r"Temperature ($^\circ$C)")
ax2.set_ylim(0, 35)
ax.set_ylim(-20,100)
plt.show()
Question

J'ai une intrigue avec deux axes y, en utilisant twinx() . Je donne aussi des étiquettes aux lignes, et je veux les montrer avec la legend() , mais je réussis seulement à obtenir les étiquettes d'un axe dans la légende:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('mathtext', default='regular')

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(time, Swdown, '-', label = 'Swdown')
ax.plot(time, Rn, '-', label = 'Rn')
ax2 = ax.twinx()
ax2.plot(time, temp, '-r', label = 'temp')
ax.legend(loc=0)
ax.grid()
ax.set_xlabel("Time (h)")
ax.set_ylabel(r"Radiation ($MJ\,m^{-2}\,d^{-1}$)")
ax2.set_ylabel(r"Temperature ($^\circ$C)")
ax2.set_ylim(0, 35)
ax.set_ylim(-20,100)
plt.show()

Donc, je reçois seulement les étiquettes du premier axe dans la légende, et non l'étiquette «temp» du second axe. Comment pourrais-je ajouter cette troisième étiquette à la légende?




Un hack rapide qui peut répondre à vos besoins.

Retirez le cadre de la boîte et positionnez manuellement les deux légendes côte à côte. Quelque chose comme ça..

ax1.legend(loc = (.75,.1), frameon = False)
ax2.legend( loc = (.75, .05), frameon = False)

Où le tuple loco est de gauche à droite et de bas en haut les pourcentages qui représentent l'emplacement dans le graphique.




À partir de la version 2.1 de matplotlib, vous pouvez utiliser une légende de la figure . Au lieu de ax.legend() , qui produit une légende avec les poignées de l' ax , on peut créer une légende de la figure

fig.legend(loc=1)

qui rassemblera toutes les poignées de toutes les sous-placettes de la figure. Comme c'est une légende de la figure, elle sera placée au coin de la figure, et l'argument loc est relatif à la figure.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10)
y = np.linspace(0,10)
z = np.sin(x/3)**2*98

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y, '-', label = 'Quantity 1')

ax2 = ax.twinx()
ax2.plot(x,z, '-r', label = 'Quantity 2')
fig.legend(loc=1)

ax.set_xlabel("x [units]")
ax.set_ylabel(r"Quantity 1")
ax2.set_ylabel(r"Quantity 2")

plt.show()

Afin de replacer la légende dans les axes, on fournirait un bbox_to_anchor et un bbox_transform . Ce dernier serait la transformation des axes des axes dans lesquels la légende devrait résider. La première peut être les coordonnées du bord défini par loc donné en coordonnées d'axes.

fig.legend(loc=1, bbox_to_anchor=(1,1), bbox_transform=ax.transAxes)




Related