Wie man logarithmische Bins in einem Python-Histogramm hat


77

Soweit ich weiß, bezieht sich die Option Log = True in der Histogrammfunktion nur auf die y-Achse.

P.hist(d,bins=50,log=True,alpha=0.5,color='b',histtype='step')

Ich muss die Behälter in log10 gleichmäßig verteilen. Gibt es etwas, das das kann?


1
Sie müssen die Anzahl in jedem Behälter durch die Behälterbreite teilen, wenn Sie dies tun!
Friedlicher

Antworten:


124

Verwenden Sie logspace (), um eine geometrische Sequenz zu erstellen und an den Parameter bins zu übergeben. Stellen Sie die xaxis-Skala auf logarithmische Skalierung ein.

import pylab as pl
import numpy as np

data = np.random.normal(size=10000)
pl.hist(data, bins=np.logspace(np.log10(0.1),np.log10(1.0), 50))
pl.gca().set_xscale("log")
pl.show()

Geben Sie hier die Bildbeschreibung ein


20
Beachten Sie, dass np.logspace(0.1,1.0,...)ein Bereich von 10**0.1bis 10**1.0, nicht von 0.1bis erstellt wird1.0
Andre Holzner

12
sollte seinnp.logspace(np.log10(0.1),np.log10(1.0),50)
OrangeSherbet

1
Siehe meine Antwort zur Verwendung von bins = 'auto'
N. McA.

20

Der direkteste Weg besteht darin, nur das log10 der Grenzwerte zu berechnen, linear beabstandete Bins zu berechnen und dann durch Erhöhen auf die Potenz 10 wie folgt zurückzurechnen:

import pylab as pl
import numpy as np

data = np.random.normal(size=10000)

MIN, MAX = .01, 10.0

pl.figure()
pl.hist(data, bins = 10 ** np.linspace(np.log10(MIN), np.log10(MAX), 50))
pl.gca().set_xscale("log")
pl.show()

log10 beabstandete Behälter


10

Der folgende Code gibt an, wie Sie bins='auto'die Protokollskala verwenden können.

import numpy as np
import matplotlib.pyplot as plt

data = 10**np.random.normal(size=500)

_, bins = np.histogram(np.log10(data + 1), bins='auto')
plt.hist(data, bins=10**bins);
plt.gca().set_xscale("log")

Diagramm


0

Zusätzlich zu den Angaben funktioniert dies auch für Pandas-Datenrahmen:

some_column_hist = dataframe['some_column'].plot(bins=np.logspace(-2, np.log10(max_value), 100), kind='hist', loglog=True, xlim=(0,max_value))

Ich würde darauf hinweisen, dass es ein Problem mit der Normalisierung der Behälter geben könnte. Jeder Behälter ist größer als der vorherige und muss daher durch seine Größe geteilt werden, um die Frequenzen vor dem Plotten zu normalisieren, und es scheint, dass weder meine Lösung noch die Lösung von HYRY dies berücksichtigen.

Quelle: https://arxiv.org/pdf/cond-mat/0412004.pdf

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.