[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm

Beim Zeichnen eines Histogramms mit zwei Variablen wird entweder der Farbe oder der Dichte entweder ein "dreidimensionaler Graph" oder eine "zweidimensionale Frequenz" zugewiesen. Während es leicht ist, die Änderung der Frequenzrichtung im dreidimensionalen Diagramm zu verstehen, kann es schwierig sein, die Gesamtverteilung zu verstehen, da es verborgene Teile gibt. Wenn andererseits die Frequenz der Farbe oder Dichte in zwei Dimensionen zugeordnet wird, ist es schwierig, den subtilen Unterschied in der Frequenzrichtung zu verstehen, aber es ist leicht zu erfassen, wie die Gesamtverteilung ist.

Daten

Zwei zweidimensionale Normalverteilungen werden als Daten verwendet. Die Verteilung ist wie folgt.

import numpy as np
x, y = np.vstack((np.random.multivariate_normal([0, 0], [[10.0, 0],[0,20]], 5000) 
                 ,np.random.multivariate_normal([0,15], [[10.0, 0],[0, 5]], 5000))).T

hist2d_01.png

2D histogram Das zweidimensionale Histogramm verwendet hist2d von matplotlib. Die Frequenz des Histogramms wird als Rückgabewert erhalten. Die Rückgabewerte sind "Anzahl, xedges, yedges, Image".

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=40, cmap=cm.jet)
ax.set_title('1st graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_02.png

Angabe der Anzahl der Fächer

Die Anzahl der Fächer wird durch die Parameterfächer bestimmt. Wenn durch Skalar angegeben, ist die Anzahl der Fächer sowohl vertikal als auch horizontal gleich. Wenn Sie sie separat angeben möchten, verwenden Sie das Beispiel. Die Kante kann auf dieselbe Weise wie das eindimensionale Histogramm angegeben werden.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[40,10], cmap=cm.jet)
ax.set_title('2nd graph')
ax.set_xlabel('x')
ax.set_ylabel('y')

fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_03.png

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], cmap=cm.jet)
ax.set_title('3rd graph')
ax.set_xlabel('x')
ax.set_ylabel('y')

fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_04.png

Normalisierung

Wenn Sie das Histogramm normalisieren möchten, setzen Sie den Parameter normiert auf True.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], normed=True, cmap=cm.jet)
ax.set_title('4th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')

fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_05.png

Ändern Sie die Farbkarte

Um die Farbkarte zu ändern, geben Sie sie im Parameter cmap an, wie im Beispiel gezeigt.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], normed=True, cmap=cm.gray)
ax.set_title('5th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_06.png

Geben Sie den Bereich der Farbkarte an

Möglicherweise möchten Sie beim Vergleich mehrerer Histogramme einen Farbkartenbereich angeben. Verwenden Sie in diesem Fall set_clim wie im Beispiel.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], normed=True, cmap=cm.jet)
ax.set_title('6th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
H[3].set_clim(0,0.05)
fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_07.png

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], normed=True, cmap=cm.jet)
ax.set_title('7th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
H[3].set_clim(0,0.01)
fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_08.png

Logarithmische Darstellung

Wenn das Histogramm logarithmisch skaliert werden soll, verwenden Sie matplotlib.colors.LogNorm ().

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], norm=matplotlib.colors.LogNorm(), cmap=cm.jet)
ax.set_title('8th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')

fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_09.png

Überlagern Sie die Kontur über dem Histogramm

Konturlinien werden mit Kontur geschrieben. Beachten Sie zu diesem Zeitpunkt die folgenden Punkte

  1. Geben Sie die Maximal- und Minimalwerte mit Ausdehnung an, damit die horizontale und vertikale Position mit dem Histogramm übereinstimmen.
  2. Zählt Transponierungen, da sie Daten der x-Achse in vertikaler Richtung und Daten der y-Achse in horizontaler Richtung enthalten.
  3. Verwenden Sie LogNorm für die logarithmische Anzeige. Sie müssen das nicht haben, aber Sie können die Linie ohne es kaum sehen.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

counts, xedges, yedges, Image= ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], norm=matplotlib.colors.LogNorm(), cmap=cm.jet)
ax.contour(counts.transpose(),extent=[xedges.min(),xedges.max(),yedges.min(),yedges.max()])
ax.set_title('8th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(Image,ax=ax)
plt.show()

hist2d_10.png

Machen Sie die Behälterform des Histogramms sechseckig

Wenn Sie die Form der Flasche sechseckig machen möchten.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hexbin(x,y, gridsize=20, extent=[-30, 30, -30, 30], cmap=cm.jet)
ax.set_title('8th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(H,ax=ax)
plt.show()

hist2d_11.png

Glätten Sie das Histogramm (Schätzung der Kerneldichte)

Das Histogramm ist blockartig, insbesondere wenn die Behälter einen großen Abstand haben. Es gibt eine Methode namens Kernel-Dichteschätzung, um dies reibungslos zu verbinden. Dies dient zur Schätzung der Wahrscheinlichkeitsdichtefunktion aus der Stichprobenverteilung von Zufallsvariablen.

Die Schätzung der Kerneldichte ist in scipy und scikit-learn enthalten. Die Kerndichteschätzung von scipy gibt die durch die Standardabweichung normalisierte Bandbreite an. Selbst wenn sich die Verteilung der Daten ändert, kann dies zu einer reibungslosen Schätzung führen. Wenn daher der Parameter bw_method = 1.0 ist, wird value.std (ddof = 1) als Bandbreite verwendet. (Wert ist Daten) Hier wird ddof bei der Berechnung der Standardabweichung bei Delta-Freiheitsgraden durch N-ddof geteilt.

Mit kernel = gaussian_kde (value) ist der Kernel ein gaussian_kde-Objekt. Wenn Sie also wirklich den Wert erhalten möchten, Übergeben Sie die Positionen der x- und y-Koordinaten wie "Kernel (Positionen)".

Tatsächlich wird ein Netz mit mgrid erstellt, x und y werden mit ravel separat eindimensional gemacht, und sie werden mit vstack angehängt und dann an den Kernel übergeben.

Da der vom Kernel (Positionen) zurückgegebene Wert eindimensional ist, wird er durch Umformung zweidimensional gemacht.

Schließlich wird es als Grafik mit Kontur angezeigt.

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
import matplotlib.cm as cm

xx,yy = np.mgrid[-30:30:1,-30:30:1]
positions = np.vstack([xx.ravel(),yy.ravel()])
 
value = np.vstack([x,y])

kernel = gaussian_kde(value)

f = np.reshape(kernel(positions).T, xx.shape)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.contourf(xx,yy,f, cmap=cm.jet)
ax.set_title('11th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

hist2d_12.png

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
import matplotlib.cm as cm

xx,yy = np.mgrid[-30:30:1,-30:30:1]
positions = np.vstack([xx.ravel(),yy.ravel()])
 
value = np.vstack([x,y])

kernel = gaussian_kde(value, bw_method=0.5)

f = np.reshape(kernel(positions).T, xx.shape)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.contourf(xx,yy,f, cmap=cm.jet)
ax.set_title('12th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

hist2d_13.png

Bei Verwendung von histogram2d von numpy

Sie können ein Histogramm mit histogram2d aus numpy erstellen. In diesem Fall können die Frequenz und die Kanten von x und y ermittelt werden, sodass Sie sie selbst grafisch darstellen müssen. Hier wurde imshow zur Anzeige verwendet. Zu diesem Zeitpunkt enthalten die Histogrammdaten die Daten in x-Achsenrichtung in vertikaler Richtung und die Daten in y-Achsenrichtung in horizontaler Richtung, ähnlich wie hist2d in matplotlib. Es wird transponiert und der Startpunkt wird auf links unten gesetzt.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = np.histogram2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)])
im = ax.imshow(H[0].T, interpolation='nearest', origin='lower', extent=[-30,30,-30,30], cmap=cm.jet)
ax.set_title('13st graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(im, ax=ax)
plt.show()

hist2d_14.png

Recommended Posts

[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
[Python] Wie zeichnet man mit Matplotlib ein Streudiagramm?
Lesen einer CSV-Datei mit Python 2/3
So erstellen Sie eine JSON-Datei in Python
[Python] Zeichnen mehrerer Diagramme mit Matplotlib
Schritte zum Erstellen eines Twitter-Bots mit Python
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
Erstellen Sie ein 3D-Streudiagramm mit SciPy + matplotlib (Python)
Erstellen Sie ein 3D-GIF mit Python3
Erstellen Sie ein Verzeichnis mit Python
3. Verarbeitung natürlicher Sprache mit Python 1-2. So erstellen Sie einen Korpus: Aozora Bunko
So konvertieren / wiederherstellen Sie einen String mit [] in Python
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
Ich möchte manuell eine Legende mit matplotlib erstellen
[Python] Weg zur Schlange (5) Spiele mit Matplotlib
Erstellen Sie eine 2D-CAD-Datei ".dxf" mit Python [ezdxf]
[Python] So erstellen Sie eine lokale Webserverumgebung mit SimpleHTTPServer und CGIHTTPServer
Python: So verwenden Sie Async mit
Löse ABC166 A ~ D mit Python
So erstellen Sie ein Conda-Paket
Erstellen Sie eine virtuelle Umgebung mit Python!
So erstellen Sie eine virtuelle Brücke
Erste Schritte mit Python
Wie erstelle ich eine Docker-Datei?
So berechnen Sie das Datum mit Python
Schreiben Sie ein gestapeltes Histogramm mit matplotlib
So erstellen Sie eine Konfigurationsdatei
So installieren Sie NPI + Senden Sie eine Nachricht an Python
So konvertieren Sie mit Python [Anwendung] von einem Array in ein Wörterbuch
Erstellen Sie einen Mastodon-Bot mit einer Funktion, die automatisch mit Python antwortet
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
So verschieben Sie ein zweidimensionales Array nur mit Python [Hinweis]
[Python Kivy] So erstellen Sie ein einfaches Popup-Fenster
Erstellen einer Entwicklungsumgebung für die Python2.7-Serie mit Vagrant
Erstellen Sie eine Nachricht, die der Lokalisierung entspricht, mit einer Python-Übersetzungszeichenfolge
[Python Kivy] So erstellen Sie mit pyinstaller eine exe-Datei
Starten eines mit Jupyter Notebook erstellten Python-Programms
Erstellen Sie mit Class einen Python-Funktionsdekorator
So erstellen Sie einen Git-Klonordner
So fügen Sie ein Paket mit PyCharm hinzu
[Python] Wie man eine Klasse iterierbar macht
So zeichnen Sie ein Diagramm mit Matplotlib
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Erstellen Sie mit Python + PIL ein Dummy-Image.
[Python 3.8 ~] Wie man rekursive Funktionen mit Lambda-Ausdrücken intelligent definiert
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe
Versuchen Sie, eine Python-Umgebung mit Visual Studio Code & WSL zu erstellen
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
So arbeiten Sie mit BigQuery in Python
[Python] So invertieren Sie eine Zeichenfolge