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.
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
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()
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()
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()
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()
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()
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()
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()
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()
Konturlinien werden mit Kontur geschrieben. Beachten Sie zu diesem Zeitpunkt die folgenden Punkte
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()
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()
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()
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()
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()
Recommended Posts