web-dev-qa-db-fra.com

définir les limites des axes dans matplotlib pyplot

J'ai deux sous-intrigues dans une figure. Je veux définir les axes du deuxième sous-tracé de telle sorte qu'il ait les mêmes limites que le premier sous-tracé (qui change en fonction des valeurs tracées). Quelqu'un peut-il m'aider? Voici le code:

import matplotlib.pyplot as plt

plt.figure(1, figsize = (10, 20))
## First subplot: Mean value in each period (mean over replications)
plt.subplot(211, axisbg = 'w')
plt.plot(time,meanVector[0:xMax], color = '#340B8C', 
         marker = 'x', ms = 4, mec = '#87051B', markevery = (asp, 
                                                             2*asp))
plt.xticks(numpy.arange(0, T+1, jump), rotation = -45)
plt.axhline(y = Results[0], color = '#299967', ls = '--')
plt.ylabel('Mean Value')
plt.xlabel('Time')
plt.grid(True)


## Second subplot: moving average for determining warm-up period
## (Welch method)
plt.subplot(212)    
plt.plot(time[0:len(yBarWvector)],yBarWvector, color = '#340B8C')
plt.xticks(numpy.arange(0, T+1, jump), rotation = -45)
plt.ylabel('yBarW')
plt.xlabel('Time')
plt.xlim((0, T))
plt.grid(True)

Dans la deuxième sous-intrigue, quels devraient être les arguments de la fonction plt.ylim()? J'ai essayé de définir

ymin, ymax = plt.ylim()

dans le premier sous-tracé, puis définissez

plt.ylim((ymin,ymax))

dans la deuxième sous-intrigue. Mais cela n'a pas fonctionné, car la valeur renvoyée ymax est la valeur maximale prise par la variable y (valeur moyenne) dans le premier sous-tracé et non la limite supérieure de l'axe des y.

Merci d'avance.

24
Curious2learn

J'ai cherché un peu plus sur le site Web de matplotlib et j'ai trouvé un moyen de le faire. Si quelqu'un a un meilleur moyen, faites-le moi savoir.

Dans le premier sous-tracé, remplacez plt.subplot(211, axisbg = 'w') par ax1 = plt.subplot(211, axisbg = 'w'). Ensuite, dans le deuxième sous-tracé, ajoutez les arguments sharex = ax1 et sharey = ax1 à la commande subplot. Autrement dit, la deuxième commande de sous-tracé ressemblera maintenant:

plt.subplot(212, sharex = ax1, sharey = ax1)

Cela résout le problème. Mais s'il existe d'autres meilleures alternatives, faites-le moi savoir.

12
Curious2learn

La solution que vous proposez devrait fonctionner, surtout si les tracés sont interactifs (ils resteront synchronisés si l'un change).

Comme alternative, vous pouvez définir manuellement les limites y du deuxième axe pour qu'elles correspondent à celles du premier. Exemple:

from pylab import *

x = arange(0.0, 2.0, 0.01)
y1 = 3*sin(2*pi*x)
y2 = sin(2*pi*x)

figure()
ax1 = subplot(211)
plot(x, y1, 'b')

subplot(212)
plot(x, y2, 'g')
ylim( ax1.get_ylim() )        # set y-limit to match first axis

show()

alt text

14
Amro