web-dev-qa-db-fra.com

Matplotlib / pyplot: Comment appliquer la plage d'axes?

Je voudrais dessiner un graphe linéaire 2D standard avec pylot, mais imposer que les valeurs des axes soient comprises entre 0 et 600 sur le x, et 10k et 20k sur le y. Laissez-moi partir avec un exemple ...

import pylab as p

p.title(save_file)
p.axis([0.0,600.0,1000000.0,2000000.0])

#define keys and items elsewhere..
p.plot(keys,items)
p.savefig(save_file, dpi=100)

Cependant, les axes s'adaptent toujours à la taille des données. J'interprète l'effet de p.axis comme définissant ce que pourraient être le maximum et le minimum, sans les imposer au maximum ou au minimum. La même chose se produit lorsque j'essaie d'utiliser p.xlim (), etc.

Des pensées?

Merci.

50
Stuart

L'appel de p.plot Après avoir défini les limites est la raison pour laquelle il redimensionne. Vous avez raison de dire que désactiver la mise à l'échelle automatique donnera la bonne réponse, mais il en ira de même pour appeler xlim() ou ylim()après votre commande plot.

J'utilise beaucoup cela pour inverser l'axe des x, je travaille en astronomie et nous utilisons un système de magnitude qui est inversé (c'est-à-dire que les étoiles les plus brillantes ont une plus petite magnitude), donc j'échange habituellement les limites avec

lims = xlim()
xlim([lims[1], lims[0]]) 
35
Simon Walker

Pour répondre à ma propre question, l’astuce consiste à désactiver la mise à l’échelle automatique ...

p.axis([0.0,600.0, 10000.0,20000.0])
ax = p.gca()
ax.set_autoscale_on(False)
26
Stuart

J'ai essayé toutes les réponses ci-dessus, puis j'ai résumé un pipeline de tracés permettant de dessiner l'image à axes fixes. Elle s'appliquait à la fois à la fonction show et à la fonction savefig.

  1. avant de comploter:

    fig = pylab.figure()
    ax = fig.gca()
    ax.set_autoscale_on(False)
    

C'est pour demander un ax qui est subplot(1,1,1).

  1. Pendant l'intrigue:

    ax.plot('You plot argument') # Put inside your argument, like ax.plot(x,y,label='test')
    ax.axis('The list of range') # Put in side your range [xmin,xmax,ymin,ymax], like ax.axis([-5,5,-5,200])
    
  2. Après l'intrigue:

    1. Pour montrer l'image:

      fig.show()
      
    2. Pour enregistrer la figure:

      fig.savefig('the name of your figure')
      

Je découvre que mettre axis au début du code ne fonctionnera pas même si j'ai défini autoscale_on Sur False.

J'ai utilisé ce code pour créer une série d'animation. Et ci-dessous est l'exemple de la combinaison d'images à axes fixes multiples dans une animation. img

11
tk_y1275963

Essayez de mettre l'appel à axis après toutes les commandes de traçage.

7
Philipp