web-dev-qa-db-fra.com

Tracer les axes logarithmiques avec matplotlib dans python

Je veux tracer un graphique avec un axe logarithmique en utilisant matplotlib.

J'ai lu la documentation, 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 n'arrive pas à comprendre.

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

Vous pouvez utiliser la méthode Axes.set_yscale . Cela vous permet de changer d'é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 la balance si vous en aviez besoin.

La ligne pertinente à ajouter est:

_ax.set_yscale('log')
_

Vous pouvez utiliser _'linear'_ pour revenir à une échelle linéaire. Voici à quoi ressemblerait votre code:

_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

320
Mathieu

Tout d’abord, il n’est pas très ordonné de mélanger du code pylab et pyplot. De plus, le style pyplot est préférable à l'utilisation de pylab .

Voici un code légèrement nettoyé, 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() ).

Vérifiez ma question Quelle est la différence entre ‘log’ et ‘symlog’? pour voir quelques exemples des échelles de graphes offertes par matplotlib.

262
Denilson Sá Maia

Vous devez simplement utiliser semilogy au lieu de plot:

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()
63
Scott McCammon

si vous voulez changer la base du logarithme, ajoutez simplement:

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

Je sais que cela est un peu hors sujet, car certains commentaires ont mentionné la ax.set_yscale('log') comme étant la "solution la plus agréable". 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 en barres. Dans ma version (0.99.1.1), je rencontrais des problèmes de rendu - je ne savais pas à quel point ce problème était général. Cependant, bar et hist ont tous les deux des arguments facultatifs pour définir l’échelle y sur le journal, ce 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

8
user3465408

Donc, si vous utilisez simplement l’API peu sophistiquée, comme je le suis souvent (je l’utilise souvent dans ipython), c’est tout simplement

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

J'espère que cela aide quelqu'un qui cherche une réponse simple! :).

5
crazy2be