Tracer des axes logarithmiques avec matplotlib en python

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

j'ai lu les docs, mais je n'arrive pas à trouver la syntaxe. Je sais que c'est probablement quelque chose de simple comme 'scale=linear' dans les arguments d'intrigue, mais je ne semble pas pouvoir obtenir le 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()
267
demandé sur Max Ghenis 2009-04-21 22:00:26

6 réponses

vous pouvez utiliser la méthode Axes.set_yscale . Cela vous permet de changer l'échelle après la création de l'objet Axes . Cela vous permettrait également de construire un contrôle pour permettre à l'utilisateur de choisir la balance si vous en avez besoin.

la ligne pertinente à ajouter est la suivante:

ax.set_yscale('log')

Vous pouvez utiliser 'linear' pour passer d'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

281
répondu Mathieu 2018-01-15 17:39:19

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

voici un code légèrement nettoyé, en utilisant seulement pyplot fonctions:

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() . Rappelez - vous que vous pouvez également changer L'échelle de l'axe X, en utilisant pyplot.xscale() (ou Axes.set_xscale() ).

cochez ma question Quelle est la différence entre ‘log’ et ‘symlog’? pour voir quelques exemples des échelles de graphe que matplotlib offre.

237
répondu Denilson Sá Maia 2017-05-23 12:10:26

vous avez simplement besoin d'utiliser semilogy au lieu de parcelle:

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()
57
répondu Scott McCammon 2009-04-21 18:07:42

je sais que c'est légèrement hors sujet, puisque certains commentaires mentionnaient que la solution ax.set_yscale('log') était" la plus gentille " j'ai pensé qu'une réfutation pourrait être due. Je ne recommande pas d'utiliser ax.set_yscale('log') pour les histogrammes et les diagrammes à barres. Dans ma version (0.99.1.1), j'ai rencontré des problèmes de rendu - Je ne sais pas si ce problème est général. Cependant, bar et hist ont des arguments optionnels pour définir l'échelle en y à log, ce qui fonctionne très 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
répondu user3465408 2014-04-08 18:14:47

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
8
répondu Dawid 2017-12-25 11:56:07

donc si vous utilisez simplement L'API non sophistiquée, comme je le fais souvent (je l'utilise beaucoup dans ipython), alors c'est tout simplement

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

Espérons que cela aide quelqu'un à la recherche d'une réponse simple! :).

5
répondu crazy2be 2017-03-22 00:56:11