2009-04-21 8 views
247

Je veux tracer un graphique avec un axe logarithmique en utilisant matplotlib.Tracer des axes logarithmiques avec matplotlib en python

J'ai lu les documents, mais je n'arrive pas à comprendre la syntaxe. Je sais que c'est probablement quelque chose de simple comme 'scale=linear' dans les arguments de l'intrigue, mais je ne peux pas sembler obtenir droit

Exemple de programme:

import pylab 
import matplotlib.pyplot as plt 
a = [pow(10, i) for i in range(10)] 
fig = plt.figure() 
ax = fig.add_subplot(2, 1, 1) 

line, = ax.plot(a, color='blue', lw=2) 
pylab.show() 

Répondre

55

Vous devez simplement utiliser semilogy au lieu du terrain:

from pylab import * 
import matplotlib.pyplot as pyplot 
a = [ pow(10,i) for i in range(10) ] 
fig = pyplot.figure() 
ax = fig.add_subplot(2,1,1) 

line, = ax.semilogy(a, color='blue', lw=2) 
show() 
+2

+1 pour 'semilogy()'. – EOL

+1

LOL, j'essayais log (FloatArray) pour wholetime, merci d'avoir sauvé mon jour – Pradeep

+3

Il y a aussi [semilogx] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.semilogx). Si vous avez besoin de vous connecter sur les deux axes, utilisez [loglog] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.loglog) – drevicko

259

Vous pouvez utiliser la méthode Axes.set_yscale. Cela vous permet de modifier l'échelle après la création de l'objet Axes. Cela vous permettrait également de créer un contrôle permettant à l'utilisateur de choisir l'échelle si nécessaire.

La ligne concernée à ajouter est:

ax.set_yscale('log') 

Vous pouvez utiliser 'linear' pour revenir à une échelle linéaire. Voici ce que votre code ressemblerait à ceci:

import pylab 
import matplotlib.pyplot as plt 
a = [pow(10, i) for i in range(10)] 
fig = plt.figure() 
ax = fig.add_subplot(2, 1, 1) 

line, = ax.plot(a, color='blue', lw=2) 

ax.set_yscale('log') 

pylab.show() 

result chart

+6

Cette méthode est sympa car elle fonctionne avec toutes sortes de tracés (ex: histogrammes) , pas seulement avec "plot" (ce que fait semilogx/semilogy) –

+1

Et si je voulais avoir un axe exponentiel? –

+13

Je suis venu ici pour savoir comment utiliser un axe pour les puissances de deux: pylab.gca(). Set_xscale ('log', basex = 2) – zje

223

D'abord, ce n'est pas très bien rangé mélanger le code pylab et pyplot. De plus, pyplot style is preferred over using pylab.

Voici un code légèrement nettoyé, en utilisant uniquement les fonctions pyplot:

from matplotlib import pyplot 

a = [ pow(10,i) for i in range(10) ] 

pyplot.subplot(2,1,1) 
pyplot.plot(a, color='blue', lw=2) 
pyplot.yscale('log') 
pyplot.show() 

La fonction pertinente est pyplot.yscale(). Si vous utilisez la version orientée objet, remplacez-la par la méthode Axes.set_yscale(). N'oubliez pas que vous pouvez également modifier l'échelle de l'axe X en utilisant pyplot.xscale() (ou Axes.set_xscale()).

Consultez ma question What is the difference between ‘log’ and ‘symlog’? pour voir quelques exemples d'échelles de graphique que propose le matplotlib.

+0

Avait du mal à essayer de comprendre comment le faire. Cette réponse a sauvé ma journée! – HWende

+9

'pyplot.semilogy()' est plus direct. – EOL

8

Je sais que c'est un peu hors sujet, puisque certains commentaires ont mentionné le ax.set_yscale('log') pour être "la plus belle" solution que je pensais qu'une réfutation pourrait être due. Je ne recommanderais pas d'utiliser ax.set_yscale('log') pour les histogrammes et les graphiques à barres. Dans ma version (0.99.1.1), je rencontre des problèmes de rendu - je ne suis pas sûr de la façon dont ce problème est général. Cependant les deux bar et hist ont des arguments facultatifs pour définir l'échelle y à log, qui fonctionne bien.

Références: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist

4

Donc, si vous utilisez simplement l'API peu sophistiquée, comme je suis souvent (je l'utilise dans ipython beaucoup), alors ceci est tout simplement

yscale('log') 
plot(...) 

Espérons que cela aide quelqu'un qui cherche une réponse simple! :)

4

si vous voulez changer la base du logarithme, il suffit d'ajouter:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log 
Questions connexes