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




3 Answers

Vous pouvez facilement ajouter une seconde légende en ajoutant la ligne:

ax2.legend(loc=0)

Vous aurez ceci:

Mais si vous voulez toutes les étiquettes sur une légende alors vous devriez faire quelque chose comme ceci:

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

time = np.arange(10)
temp = np.random.random(10)*30
Swdown = np.random.random(10)*100-10
Rn = np.random.random(10)*100-10

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

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

# added these three lines
lns = lns1+lns2+lns3
labs = [l.get_label() for l in lns]
ax.legend(lns, labs, 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()

Ce qui vous donnera ceci:

legend plot

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?




Vous pouvez facilement obtenir ce que vous voulez en ajoutant la ligne dans ax:

ax.plot(0, 0, '-r', label = 'temp')

ou

ax.plot(np.nan, '-r', label = 'temp')

Cela ne représenterait rien mais ajouterait une étiquette à la légende de la hache.

Je pense que c'est un moyen beaucoup plus facile. Il n'est pas nécessaire de suivre automatiquement les lignes lorsque vous n'avez que quelques lignes dans les deuxièmes axes, car une fixation à la main comme ci-dessus serait très facile. Quoi qu'il en soit, cela dépend de ce dont vous avez besoin.

Le code entier est comme ci-dessous:

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

time = np.arange(22.)
temp = 20*np.random.rand(22)
Swdown = 10*np.random.randn(22)+40
Rn = 40*np.random.rand(22)

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

#---------- look at below -----------

ax.plot(time, Swdown, '-', label = 'Swdown')
ax.plot(time, Rn, '-', label = 'Rn')

ax2.plot(time, temp, '-r')  # The true line in ax2
ax.plot(np.nan, '-r', label = 'temp')  # Make an agent in ax

ax.legend(loc=0)

#---------------done-----------------

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()

L'intrigue est comme ci-dessous:

Mise à jour: ajoutez une meilleure version:

ax.plot(np.nan, '-r', label = 'temp')

Cela ne fera rien pendant que l' plot(0, 0) peut changer la gamme d'axes.




J'ai trouvé un exemple matplotlib officiel suivant qui utilise host_subplot pour afficher plusieurs axes y et toutes les étiquettes différentes dans une légende. Aucune solution de contournement nécessaire. Meilleure solution que j'ai trouvée jusqu'ici. http://matplotlib.org/examples/axes_grid/demo_parasite_axes2.html

from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA
import matplotlib.pyplot as plt

host = host_subplot(111, axes_class=AA.Axes)
plt.subplots_adjust(right=0.75)

par1 = host.twinx()
par2 = host.twinx()

offset = 60
new_fixed_axis = par2.get_grid_helper().new_fixed_axis
par2.axis["right"] = new_fixed_axis(loc="right",
                                    axes=par2,
                                    offset=(offset, 0))

par2.axis["right"].toggle(all=True)

host.set_xlim(0, 2)
host.set_ylim(0, 2)

host.set_xlabel("Distance")
host.set_ylabel("Density")
par1.set_ylabel("Temperature")
par2.set_ylabel("Velocity")

p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity")

par1.set_ylim(0, 4)
par2.set_ylim(1, 65)

host.legend()

plt.draw()
plt.show()



Related

python matplotlib axis legend