Tracer des axes logarithmiques avec matplotlib en python

369

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

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 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()
Max Ghenis
la source

Réponses:

384

Vous pouvez utiliser la Axes.set_yscaleméthode. Cela vous permet de changer l'échelle après laAxes création de objet. Cela vous permettrait également de créer un contrôle pour permettre à l'utilisateur de choisir l'échelle 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()

tableau des résultats

Mathieu
la source
6
Cette méthode est agréable car elle fonctionne avec toutes sortes de graphiques (par exemple des histogrammes), pas seulement avec "plot" (ce que fait semilogx / semilogy)
Tim Whitcomb
16
Je suis venu ici pour chercher comment utiliser un axe pour des puissances de deux: pylab.gca (). Set_xscale ('log', basex = 2)
zje
53
Matplotlib a semilogy(). De plus, il est plus facile à utiliser directement pyplot.yscale()qu'à utiliser ax.set_yscale('log'), car il n'est pas nécessaire d'obtenir l' axobjet (qui n'est pas toujours immédiatement disponible).
Eric O Lebigot
5
Si vous voulez des échelles logarithmiques sur les deux axes, essayez loglog()ou uniquement sur l'axe des xsemilogx()
drevicko
10
@EOL, je conseillerais le contraire. Il est préférable d'utiliser un axobjet explicite à utiliser pyplotqui ne pourrait s'appliquer qu'aux axes que vous souhaitez.
tacaswell
288

Tout d'abord, ce n'est pas très bien rangé pour mixer pylabet pyplotcoder. De plus, le style pyplot est préféré à l'utilisation de pylab .

Voici un code légèrement nettoyé, utilisant uniquement des pyplotfonctions:

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()(ouAxes.set_xscale() ).

Vérifiez ma question Quelle est la différence entre «log» et «symlog»? pour voir quelques exemples des échelles de graphique proposées par matplotlib.

Denilson Sá Maia
la source
J'ai eu du mal à essayer de comprendre comment le faire. Cette réponse m'a sauvé la journée!
HWende
13
pyplot.semilogy()est plus direct.
Eric O Lebigot
64

Vous devez simplement utiliser la sémilogie au lieu de l'intrigue:

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()
Scott McCammon
la source
1
LOL, j'essayais de me connecter (FloatArray) pour le temps entier, merci d'avoir sauvé ma journée
Pradeep
5
Il y a aussi semilogx . Si vous avez besoin de vous connecter sur les deux axes, utilisez loglog
drevicko
40

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

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

Je sais que cela est légèrement hors sujet, car certains commentaires mentionnaient que la ax.set_yscale('log')solution était "la plus agréable", je pensais qu'une réfutation pourrait être due. Je ne recommanderais pas d'utiliserax.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 sais pas à quel point ce problème est général. Cependant, bar et hist ont des arguments facultatifs pour définir l'échelle y sur log, 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

user3465408
la source
5

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

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

J'espère que cela aidera quelqu'un à la recherche d'une réponse simple! :).

crazy2be
la source
-1

Vous pouvez utiliser le code ci-dessous:

np.log(df['col_whose_log_you_need']).iplot(kind='histogram', bins=100,
                                   xTitle = 'log of col',yTitle ='Count corresponding to column',
                                   title='Distribution of log(col_whose_log_you_need)')
Shailaja Gupta Kapoor
la source