2016-05-11 13 views
2

Ich interessiere mich für die Verteilung der Wahrscheinlichkeitsverteilung einer Menge von Punkten, die als Potenzgesetz verteilt sind. Außerdem möchte ich logarithmisches Binning verwenden, um die großen Fluktuationen im Tail auszugleichen. Wenn ich nur logarithmischen Binning verwenden, und es auf einem Protokoll Log-Skala plotte, wieSkaliertes logarithmisches Binning in Python

pl.hist(MyList,log=True, bins=pl.logspace(0,3,50)) 
pl.xscale('log') 

zum Beispiel, dann ist das Problem, dass die größeren Behälter für mehr Punkte berücksichtigen, dh die Höhen meiner bins nicht skaliert nach Behältergröße.

Gibt es eine Möglichkeit, logarithmisches Binning zu verwenden, und dennoch Python alle Höhen um die Größe der Bin skalieren? Ich weiß, dass ich das vielleicht manuell tun kann, aber es scheint, dass dies ein Feature sein sollte, das es gibt, aber ich kann es nicht finden. Wenn Sie meinen, dass Histogramme grundsätzlich eine schlechte Möglichkeit darstellen, meine Daten zu repräsentieren, und Sie eine bessere Idee haben, dann würde ich das auch gern hören.

Danke!

+0

Möchten Sie ein Histogramm des Logarithmus der Daten UND möchten, dass die Y-Achsenskalierung logarithmisch ist? – wwii

+0

@wwii: Ich möchte ein Histogramm auf einer logarithmischen Skala erstellen, mit einem Log-Binning, so dass das Histogramm auf der Log-Log-Skala eine einheitliche Binsize zu haben scheint. – SarthakC

+0

Sorry für ein bisschen Off-Topic Förderung, aber vielleicht finden Sie nützlich meine Bibliothek ** physt **. Unter anderem bietet es verschiedene Binning-Schemata, von denen eines für exponentiell verteilte Werte geeignet ist. Siehe http://nbviewer.jupyter.org/github/janpipek/physt/blob/master/doc/Binning.ipynb und https://github.com/janpipek/physt –

Antwort

2

Matplotlib hilft Ihnen nicht viel, wenn Sie spezielle Anforderungen an Ihre Histogramme haben. Sie können jedoch ein Histogramm mit numpy einfach erstellen und bearbeiten.

import numpy as np 
from matplotlib import pyplot as plt 

# something random to plot 
data = (np.random.random(10000)*10)**3 

# log-scaled bins 
bins = np.logspace(0, 3, 50) 
widths = (bins[1:] - bins[:-1]) 

# Calculate histogram 
hist = np.histogram(data, bins=bins) 
# normalize by bin width 
hist_norm = hist[0]/widths 

# plot it! 
plt.bar(bins[:-1], hist_norm, widths) 
plt.xscale('log') 
plt.yscale('log') 

Natürlich, wenn Sie Ihre Daten in einer nicht-offensichtlichen Art und Weise tun, wie diese präsentieren, müssen Sie sehr vorsichtig sein, wie man Label Ihre y-Achse richtig und eine informative Bildunterschrift schreiben.

+0

Danke! :) Das funktioniert für meinen Zweck, obwohl ich einen direkteren Weg bevorzugen würde, wenn es existiert. Für machtgesetzliche Daten scheint dies für mich die natürlichste Art zu sein, die Daten darzustellen. Wenn es am nächsten Tag keine bessere Antwort mit Matplotlib-Funktionalität gibt, werde ich Ihre Antwort akzeptieren. – SarthakC