Zeichnen Sie logarithmische Achsen mit Matplotlib in Python


369

Ich möchte mit matplotlib ein Diagramm mit einer logarithmischen Achse zeichnen.

Ich habe die Dokumente gelesen, kann aber die Syntax nicht herausfinden. Ich weiß, dass es wahrscheinlich so einfach ist wie 'scale=linear'in den Handlungsargumenten, aber ich kann es nicht richtig machen

Beispielprogramm:

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

Antworten:


384

Sie können die Axes.set_yscaleMethode verwenden. Auf diese Weise können Sie den Maßstab ändern, nachdem das AxesObjekt erstellt wurde. Auf diese Weise können Sie auch ein Steuerelement erstellen, mit dem der Benutzer bei Bedarf die Waage auswählen kann.

Die relevante Zeile zum Hinzufügen ist:

ax.set_yscale('log')

Sie können verwenden 'linear', um zu einer linearen Skala zurückzukehren. So würde Ihr Code aussehen:

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

Ergebnisdiagramm


6
Diese Methode ist schön, da sie mit allen Arten von Plots (z. B. Histogrammen) funktioniert, nicht nur mit "Plot" (was Semilogx / Semilogy macht)
Tim Whitcomb

16
Ich bin hierher gekommen, um zu suchen, wie man eine Achse für Zweierpotenzen verwendet: pylab.gca (). Set_xscale ('log', basex = 2)
zje

53
Matplotlib hat semilogy(). Darüber hinaus ist die direkte Verwendung einfacher pyplot.yscale()als die Verwendung ax.set_yscale('log'), da das axObjekt nicht abgerufen werden muss (was nicht immer sofort verfügbar ist).
Eric O Lebigot

5
Wenn Sie Protokollskalen auf beiden Achsen wünschen, versuchen Sie es loglog()oder versuchen Sie es nur auf der x-Achsesemilogx()
drevicko

10
@EOL Ich würde das Gegenteil raten. Es ist besser, ein explizites axObjekt zu verwenden, pyplotdas möglicherweise nur für die gewünschten Achsen gilt.
Tacaswell

288

Erstens ist es nicht sehr ordentlich zu mischen pylabund zu pyplotcodieren. Was mehr ist, wird pyplot Stil gegenüber der Verwendung pylab bevorzugt .

Hier ist ein leicht bereinigter Code, der nur pyplotFunktionen verwendet:

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

Die relevante Funktion ist pyplot.yscale(). Wenn Sie die objektorientierte Version verwenden, ersetzen Sie sie durch die Methode Axes.set_yscale(). Denken Sie daran, dass Sie den Maßstab der X-Achse auch mit pyplot.xscale()(oder Axes.set_xscale()) ändern können .

Überprüfen Sie meine Frage Was ist der Unterschied zwischen 'log' und 'symlog'? um einige Beispiele für die von matplotlib angebotenen Diagrammskalen zu sehen.


Es fiel mir schwer herauszufinden, wie es geht. Diese Antwort hat mir den Tag gerettet!
HWende

13
pyplot.semilogy()ist direkter.
Eric O Lebigot

64

Sie müssen lediglich die Semilogie anstelle der Handlung verwenden:

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, ich habe versucht, Log (FloatArray) für die ganze Zeit, danke, dass Sie meinen Tag gerettet haben
Pradeep

5
Es gibt auch Semilogx . Wenn Sie sich auf beiden Achsen anmelden müssen, verwenden Sie loglog
drevicko

40

Wenn Sie die Basis des Logarithmus ändern möchten, fügen Sie einfach Folgendes hinzu:

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

8

Ich weiß, dass dies etwas vom Thema abweicht, da in einigen Kommentaren die ax.set_yscale('log')"schönste" Lösung erwähnt wurde, von der ich dachte, dass eine Widerlegung fällig sein könnte. Ich würde die Verwendung nicht empfehlenax.set_yscale('log') für Histogramme und Balkendiagramme zu verwenden. In meiner Version (0.99.1.1) habe ich einige Rendering-Probleme - ich bin mir nicht sicher, wie allgemein dieses Problem ist. Sowohl bar als auch hist haben jedoch optionale Argumente, um die y-Skala auf log zu setzen, was gut funktioniert.

Referenzen: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist


5

Wenn Sie also einfach die nicht anspruchsvolle API verwenden, wie ich es oft bin (ich verwende sie häufig in Ipython), dann ist dies einfach

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

Hoffe das hilft jemandem, der nach einer einfachen Antwort sucht! :).


-1

Sie können den folgenden Code verwenden:

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)')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.