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.