Eine kurze Zusammenfassung zum Plotten in 3D mit matplotlib. Zeichnen wir die Wahrscheinlichkeitsdichtefunktion der bivariaten Normalverteilung in 3D.
Weitere Informationen finden Sie im offiziellen Tutorial.
Importieren Sie, was Sie vorerst brauchen. Stellen Sie auch die Anzahl der Dimensionen und Parameter der Normalverteilung ein.
import matplotlib
print(matplotlib.__version__)
# 1.5.1
import numpy as np
from scipy.stats import multivariate_normal
#for plotting
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
m = 2 #dimension
mean = np.zeros(m)
sigma = np.eye(m)
In der neuesten Version (stabile Version 2.2.2) scheint es keine wesentlichen Änderungen zu geben. Siehe hier für Details. The mplot3d Toolkit
Surface Plot Versuchen Sie es mit Surface Plot (Surface Plot auf Japanisch?). Beachten Sie, dass die an die Funktion plot_surface übergebenen Daten ein zweidimensionales Array sind.
N = 1000
x1 = np.linspace(-5, 5, N)
x2 = np.linspace(-5, 5, N)
X1, X2 = np.meshgrid(x1, x2)
X = np.c_[np.ravel(X1), np.ravel(X2)]
Y_plot = multivariate_normal.pdf(x=X, mean=mean, cov=sigma)
Y_plot = Y_plot.reshape(X1.shape)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X1, X2, Y_plot, cmap='bwr', linewidth=0)
fig.colorbar(surf)
ax.set_title("Surface Plot")
fig.show()
# X1.shape : (1000, 1000)
# X2.shape : (1000, 1000)
# Y_plot.shape : (1000, 1000)
Contour Plot Das Konturdiagramm kann auf die gleiche Weise wie das Oberflächendiagramm erstellt werden.
N = 1000
x1 = np.linspace(-5, 5, N)
x2 = np.linspace(-5, 5, N)
X1, X2 = np.meshgrid(x1, x2)
X = np.c_[np.ravel(X1), np.ravel(X2)]
Y_plot = multivariate_normal.pdf(x=X, mean=mean, cov=sigma)
Y_plot = Y_plot.reshape(X1.shape)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.contour(X1, X2, Y_plot)
ax.set_title("Contour Plot")
fig.show()
# X1.shape : (1000, 1000)
# X2.shape : (1000, 1000)
# Y_plot.shape : (1000, 1000)
Scatter Plot Im Gegensatz zu zuvor sind die an das Streudiagramm übergebenen Daten ein eindimensionales Array.
N = 100
x1 = np.linspace(-5, 5, N)
x2 = np.linspace(-5, 5, N)
X1, X2 = np.meshgrid(x1, x2)
X_plot = np.c_[np.ravel(X1), np.ravel(X2)]
y = multivariate_normal.pdf(X_plot, mean=mean, cov=sigma)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(np.ravel(X1), np.ravel(X2), y)
ax.set_title("Scatter Plot")
plt.show()
# np.ravel(X1).shape : (10000,)
# np.ravel(X2).shape : (10000,)
# y.shape : (10000,)
Das Streudiagramm ist nicht für den Fall gedacht, dass Sie die Form einer solchen Funktion sehen möchten. Daher kann nicht anders, als dass es schwer zu erkennen ist.
In anderen Artikeln gibt es Beispiele für das Erstellen von Axtobjekten für 3D wie folgt:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
#<class 'mpl_toolkits.mplot3d.axes3d.Axes3D'>
In neueren Versionen wird empfohlen, dies wie im Lernprogramm zu verwenden.
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
#<class 'matplotlib.axes._subplots.Axes3DSubplot'>
Axes3D wird übrigens nicht explizit verwendet, aber wenn Sie es nicht importieren, erhalten Sie "KeyError:" 3d ".
Es scheint auch, dass Sie ein Axe-Objekt derselben Klasse wie folgt erstellen können.
fig = plt.figure()
ax = fig.gca(projection='3d')
#<class 'matplotlib.axes._subplots.Axes3DSubplot'>
Es scheint plotly zu geben, das mit Python gut in 3D plottet, also würde ich es gerne bald herausfinden.
Recommended Posts