Vous pouvez imiter un tracé 2D avec Axes3d
en définissant une projection orthographique, en initialisant la vue pour faire face au plan souhaité et en supprimant les éléments de tracé indésirables le long de l'axe orthogonal au plan de vue choisi. En outre, vous pouvez tracer des éléments 2D à l'aide de l'argument mot clé zdir
.
est ici un des exemples matplotlib 3D de terrain pour démontrer que je modifié
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
# Enable orthographic projection
# https://stackoverflow.com/questions/23840756/how-to-disable-perspective-in-mplot3d
from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
a = (zfront+zback)/(zfront-zback)
b = -2*(zfront*zback)/(zfront-zback)
return np.array([[1,0,0,0],
[0,1,0,0],
[0,0,a,b],
[0,0,-0.000001,zback]])
proj3d.persp_transformation = orthogonal_proj
fig = plt.figure()
ax = fig.gca(projection='3d')
# Init view to YZ plane
ax.view_init(azim=0, elev=0)
# Hide the X axis
ax.w_xaxis.line.set_lw(0.)
ax.set_xticks([])
# Change YZ plane colour to white
ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 1.0))
# Make data.
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
ax.set_zlim(-1.1, 1.1)
ax.set_ylabel('y')
ax.set_zlabel('z')
# Plot 2D elements with zdir argument
# https://stackoverflow.com/questions/29549905/pylab-3d-scatter-plots-with-2d-projections-of-plotted-data
stepsize = 0.1
t = np.arange(-4, 4+stepsize, step=stepsize)
ax.plot(t, 0.5*np.sin(t), 'k', zdir='x', linewidth=1.0)
ax.text(0, 0, 1, 'Text', zdir='y', ha='center', va='top')
plt.show()
Peut-être l'une des réponses à [cette question] (https://stackoverflow.com/questions/33084853/ set-matplotlib-view-to-be-normal-to-the-xy-plane-in-python) fera ce que vous voulez – user3419537
Pas tout à fait. L'angle est déjà correctement défini dans l'image supérieure. Le problème est, que je veux tracer d'autres choses en 2D ci-dessus. Donc, je veux vraiment 2D –
Matplotlib n'est pas un moteur 3D en soi. Ainsi, le rendu est défectueux. Vous pouvez utiliser tripcolor uniquement avec les triangles avant. Mais cela implique probablement que vous devez vérifier quels triangles ont des sommets avec un 'x 'supérieur à quelque chose, et tracer tous les autres. Cela pourrait fonctionner mieux ou pire selon la "forme" de votre volume, mais supposer qu'il n'y a pas de vérification de profondeur pixel par pixel. Si la forme est trop complexe, vous devrez peut-être créer votre propre petit algorithme de rendu (peut-être en utilisant imshow ou similaire). – armatita