wake-up-neo.com

zeichnen eines Histogramms auf einer Protokollskala mit Matplotlib

Ich habe einen Pandas-DataFrame, der die folgenden Werte in einer Serie hat

x = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]

Ich wurde angewiesen, zwei Histogramme in einem Jupyter-Notizbuch mit Python 3.6 zu zeichnen. Kein Schweiß richtig?

x.plot.hist(bins=8)
plt.show()

Ich habe 8 Bins ausgewählt, weil das für mich am besten aussah ... __ Ich wurde auch angewiesen, ein weiteres Histogramm mit dem Protokoll von x zu zeichnen.

x.plot.hist(bins=8)
plt.xscale('log')
plt.show()

Dieses Histogramm sieht TERRIBLE aus. Mache ich nichts richtig? Ich habe versucht, mit der Handlung herumzuspielen, aber alles, was ich versucht habe, scheint das Histogramm noch schlimmer zu machen. Beispiel:

x.plot(kind='hist', logx=True)

Ich erhielt keine anderen Anweisungen, als das Protokoll von X als Histogramm zu zeichnen. 

Ich freue mich über jede Hilfe !!! 

Für das Protokoll habe ich Pandas, Numpy und Matplotlib importiert und festgelegt, dass das Diagramm inline sein soll. 

4
Tommy

Wenn Sie bins=8 im Aufruf hist angeben, wird der Bereich zwischen dem minimalen und dem maximalen Wert gleichmäßig in 8 Bins aufgeteilt. Was auf einer linearen Skala gleich ist, wird auf einer logarithmischen Skala verzerrt. 

Sie können die Bereiche des Histogramms so angeben, dass sie in der Breite unterschiedlich sind, sodass sie auf einer logarithmischen Skala gleich aussehen. 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

x = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 
     19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]
x = pd.Series(x)

# histogram on linear scale
plt.subplot(211)
hist, bins, _ = plt.hist(x, bins=8)

# histogram on log scale. 
# Use non-equal bin sizes, such that they look equal on log scale.
logbins = np.logspace(np.log10(bins[0]),np.log10(bins[-1]),len(bins))
plt.subplot(212)
plt.hist(x, bins=logbins)
plt.xscale('log')
plt.show()

 enter image description here

plotten Sie ein weiteres Histogramm mit dem Log von x.

ist nicht dasselbe wie das Auftragen von x auf der logarithmischen Skala. Das Zeichnen des Logarithmus von x wäre

np.log(x).plot.hist(bins=8)
plt.show()

 hist

Der Unterschied ist, dass die Werte von x selbst transformiert wurden: Wir betrachten ihren Logarithmus. 

Dies unterscheidet sich von der Darstellung auf der logarithmischen Skala, bei der x gleich bleibt, aber die Art und Weise, in der die horizontale Achse markiert ist, geändert wird (wodurch die Balken nach rechts gedrückt und nach links gedehnt werden).

4
user6655984

Hier ist eine weitere Lösung, ohne eine Unterzeichnung zu verwenden oder zwei Dinge im selben Bild zu zeichnen.

import numpy as np
import matplotlib.pyplot as plt

def plot_loghist(x, bins):
  hist, bins = np.histogram(x, bins=bins)
  logbins = np.logspace(np.log10(bins[0]),np.log10(bins[-1]),len(bins))
  plt.hist(x, bins=logbins)
  plt.xscale('log')

plot_loghist(np.random.Rand(200), 10)

example hist plot

4
Rahul Shaw