Dies ist die Fortsetzung dieses Artikels → ["Machen Sie die vertikale Achse des Histogramms zur relativen Häufigkeit (Gesamthöhe der Spalten = 1) und zur relativen Frequenzdichte (Gesamtfläche des Histogramms = 1) mit matplotlib"](https: // qiita. com / kanedaq / items / 1e7a0e52363224c08980)
Verwenden Sie matplotlib, um ein Histogramm zu erstellen
Und zeichne. Es kann jedoch ein böser Weg sein.
[Python] Wie zeichnet man mit matplotlib ein Diagramm mit zwei Achsen links und rechts?
Die Anzahl der Daten beträgt 7.500 und es handelt sich um eine normale Zufallszahl mit einem Durchschnittswert von 50 und einer Standardabweichung von 10. Versuchen Sie zunächst, den folgenden Python-Code auszuführen.
#%%
import numpy as np
import matplotlib.pyplot as plt
#%%
#Datenerstellung
μ = 50
σ = 10
data = [ np.random.normal(μ, σ) for i in range(7500) ]
#%%
#Anzahl der Klassen
num_bins = 20
#Diagrammzeichnung
fig = plt.figure(figsize=(12, 8))
plt.legend()
plt.xlabel('x', fontsize=18)
plt.title('null', fontsize=18)
# (1)Ein Histogramm mit der vertikalen Achse als Frequenz
ax1 = fig.add_subplot(111)
ax1.set_ylabel('frequency', fontsize=18)
ax1.grid(True, color="dimgray")
ax1.set_axisbelow(True) #Bewegen Sie das Gitter nach hinten
ax1.hist(data, bins=num_bins, rwidth=0.5, align="mid")
# (2)Ein Histogramm mit der vertikalen Achse als relativer Frequenz
ax2 = ax1.twinx()
ax2.set_ylabel('relative frequency', fontsize=18)
ax2.grid(True, color="lightgrey", linestyle="--")
ax2.set_axisbelow(True) #Bewegen Sie das Gitter nach hinten
weights = np.ones_like(data) / len(data)
ax2.hist(data, bins=num_bins, weights=weights, rwidth=0.5, align="right", color="red")
Die vertikale Achse = die Frequenzspalte wird in der Standardfarbe gezeichnet, und die vertikale Achse = die Spalte der relativen Frequenz wird nebeneinander in Rot gezeichnet. Leute bestätigen, dass die Höhen beider gleich aussehen </ font> (Der Grund, warum sie böse sind ...)
Wenn die Höhen der Frequenzspalten und die relative Häufigkeit gleich aussehen, stimmen Sie mit den Farben der Spalten überein. Rufen Sie ax2.hist () auf, ohne "color =" red "" anzugeben.
Die Gitterlinie von ax2 wird vor der Säule von ax1 angezeigt. Um diese horizontale Linie unsichtbar zu machen, habe ich beschlossen, den folgenden Code hinzuzufügen, um dasselbe Diagramm wie ax1 zu überschreiben.
# (3) (1)Passen Sie das Erscheinungsbild von an
ax3 = ax1.twinx()
ax3.set_yticklabels([])
ax3.hist(data, bins=num_bins, rwidth=0.5, align="mid")
Der gesamte Code für die fertige Version ist unten.
#%%
import numpy as np
import matplotlib.pyplot as plt
#%%
#Datenerstellung
μ = 50
σ = 10
data = [ np.random.normal(μ, σ) for i in range(7500) ]
#%%
#Anzahl der Klassen
num_bins = 20
#Diagrammzeichnung
fig = plt.figure(figsize=(12, 8))
plt.legend()
plt.xlabel('x', fontsize=18)
plt.title('null', fontsize=18)
# (1)Ein Histogramm mit der vertikalen Achse als Frequenz
ax1 = fig.add_subplot(111)
ax1.set_ylabel('frequency', fontsize=18)
ax1.grid(True, color="dimgray")
ax1.set_axisbelow(True) #Bewegen Sie das Gitter nach hinten
ax1.hist(data, bins=num_bins, rwidth=0.5, align="mid")
# (2)Ein Histogramm mit der vertikalen Achse als relativer Frequenz
ax2 = ax1.twinx()
ax2.set_ylabel('relative frequency', fontsize=18)
ax2.grid(True, color="lightgrey", linestyle="--")
ax2.set_axisbelow(True) #Bewegen Sie das Gitter nach hinten
weights = np.ones_like(data) / len(data)
ax2.hist(data, bins=num_bins, weights=weights, rwidth=0.5, align="right")
# (3) (1)Passen Sie das Erscheinungsbild von an
ax3 = ax1.twinx()
ax3.set_yticklabels([])
ax3.hist(data, bins=num_bins, rwidth=0.5, align="mid")
Es fühlt sich wie ein böser Weg an, also lassen Sie mich bitte wissen, ob es einen einfachen Ansatz gibt.
Recommended Posts