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

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

Mathieu
quelle
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.

Denilson Sá Maia
quelle
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()
Scott McCammon
quelle
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
Dawid
quelle
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

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

crazy2be
quelle
-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)')
Shailaja Gupta Kapoor
quelle