Un bref résumé pour le traçage en 3D avec matplotlib. Tracons la fonction de densité de probabilité de la distribution normale bivariée en 3D.
Voir le [tutoriel] officiel (https://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html) pour plus de détails.
Importez ce dont vous avez besoin pour le moment. Définissez également le nombre de dimensions et de paramètres de la distribution normale.
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)
Il ne semble pas y avoir de changement majeur dans la dernière version (version stable ver 2.2.2). Voir ici pour plus de détails. The mplot3d Toolkit
Surface Plot Essayez Surface Plot (tracé de surface en japonais?). Notez que les données passées à la fonction plot_surface sont un tableau à deux dimensions.
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 Le tracé de contour peut être réalisé de la même manière que le tracé de surface.
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 Contrairement à auparavant, les données transmises au nuage de points sont un tableau unidimensionnel.
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,)
Le nuage de points n'est pas fait pour lorsque vous voulez voir la forme d'une telle fonction, il ne peut donc pas être aidé qu'il soit difficile à voir.
En regardant d'autres articles, il existe des exemples de création d'objets hache pour la 3D comme suit, mais
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
#<class 'mpl_toolkits.mplot3d.axes3d.Axes3D'>
Dans les versions récentes, il semble recommandé de l'utiliser comme dans le tutoriel.
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'>
Au fait, Axes3D n'est pas utilisé explicitement, mais si vous ne l'importez pas, vous obtiendrez KeyError: '3d'
.
De plus, il semble que vous puissiez créer un objet hache de la même classe comme suit.
fig = plt.figure()
ax = fig.gca(projection='3d')
#<class 'matplotlib.axes._subplots.Axes3DSubplot'>
Il semble y avoir plotly qui trace bien en 3D avec python, alors j'aimerais le savoir bientôt.
Recommended Posts