Sie können ein 2D-Diagramm mit Axes3d
nachahmen, indem Sie eine orthografische Projektion einstellen, die Ansicht auf die gewünschte Ebene ausrichten und unerwünschte Zeichenelemente entlang der Achse orthogonal zur ausgewählten Ansichtsebene entfernen. Außerdem können Sie 2D-Elemente mit dem Schlüsselwort zdir
plotten.
Hier ist eine der matplotlib 3D-Plot Beispiele I
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()
Vielleicht eine der Antworten auf [diese Frage] zu demonstrieren modifizierte (https://stackoverflow.com/questions/33084853/ Set-Matplotlib-Ansicht-zu-Normal-zu-der-XY-Ebene-in-Python) wird tun, was Sie wollen – user3419537
Nicht ganz. Der Winkel ist im oberen Bild bereits richtig eingestellt. Das Problem ist, dass ich andere Dinge in 2D oben plotten möchte. Also ich möchte wirklich 2D –
Matplotlib ist keine 3D-Engine per se. Da ist das Rendering fehlerhaft. Sie können tripcolor nur mit den vorderen Dreiecken verwenden. Aber das bedeutet wahrscheinlich, dass Sie überprüfen müssen, welche Dreiecke Scheitelpunkte mit einem "x" größer als etwas haben, und alle anderen zeichnen. Dies kann je nach "Form" Ihres Volumes besser oder schlechter funktionieren, aber Sie gehen davon aus, dass es keine pixelgenaue Tiefenprüfung gibt. Wenn die Form zu komplex ist, müssen Sie möglicherweise einen eigenen kleinen Rendering-Algorithmus erstellen (vielleicht mit imshow o.ä.). – armatita