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

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


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.


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

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

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


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! :).


-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)')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.