2017-05-17 12 views
1

Mit Matplotlib, wie kann ich die folgenden algebraischen Gleichungen in 3d plotten? Möchte den Schnittpunkt von 3-Ebenen visualisieren.Mit Matplotlib wie algebraische Gleichungen plotten

x - y + 2z = 5 

    y - z = -1 

     z = 3 
+1

Es heißt * matplotlib * nicht * mat ** h ** plotlib * - bedeutet, dass mathematische Funktionen nicht dargestellt werden. Sie müssen diskrete Werte von Paaren (x, y, z) berechnen, um sie zu zeichnen. Alternativ können Sie sich auch das [sympys Plotting-Modul] (http://docs.sympy.org/dev/modules/plotting.html) ansehen, das eher mit dem übereinstimmt, was Sie erreichen möchten. – kazemakase

+1

Ich dachte immer Matplotlib steht für Mat ** h ** ematic Plotten Bibliothek. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest nur um zu verdeutlichen, schrieb das OP ursprünglich matplotlib mit h. Ich dachte eher, dass es nach Matlab benannt wurde, was eine Abkürzung für * Matrix Laboratory * ist. – kazemakase

Antwort

2

Die Gleichungen müssen in eine geschlossene Form gebracht werden, um mit Matplotlib geplottet zu werden. Dies ist relativ einfach für diese Gleichungen aus der Frage.
Man kann dann ein Meshgrid in 2 Dimensionen verwenden, um die Werte der fehlenden Dimension gemäß den Gleichungen zu berechnen. Nun können wir Werte für alle 3 Dimensionen verwenden, um die Ebenen mit plot_surface zu plotten.

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 


z1 = lambda x,y: 5./2.-x/2.+y/2. # x - y + 2z = 5 
z2 = lambda x,y: y+1    #  y - z = -1 
z3 = lambda x,y: 3.*np.ones_like(x) #   z = 3 

x = np.arange(-3,3) 
X,Y = np.meshgrid(x,x) 


fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.set_xlabel("x"); ax.set_ylabel("y"); ax.set_zlabel("z") 


surf = ax.plot_surface(X, Y, z1(X,Y), color="C1", linewidth=0, shade=False) 
surf = ax.plot_surface(X, Y, z2(X,Y), color="C2", linewidth=0, shade=False) 
surf = ax.plot_surface(X, Y, z3(X,Y), color="C3", linewidth=0, shade=False) 


plt.show() 

enter image description here

Die Flugzeuge scheinen nicht zu schneiden, was nicht matplotlib gebührt Renderer eine echte 3D zu sein.

+0

Danke! Genau das habe ich gesucht. Gibt es keinen Grund, kein echter 3D-Renderer zu sein? Ich sehe komplexere 3D-Beispiele in ihrer Galerie. – Godekere

+1

Die Künstler in einem 3D-Plot werden einfach auf 2D-Raum projiziert. Dies bedeutet, dass ein Künstler entweder vor oder hinter einem anderen steht, aber nicht teilweise davor und teilweise dahinter. Der einzige Weg, dies in Matplotlib zu lösen, wäre, die Ebene je nach Betrachtungswinkel in zwei Teile zu unterteilen. – ImportanceOfBeingErnest

+1

Mit% matplotlib Notebook und mit alpha = 0,5 in allen plot_surface .... zB :. ax.plot_surface (X, Y, z1 (X, Y), Alpha = 0.5, rstride = 100, cstride = 100), kann ich den Betrachtungswinkel ändern, um den Schnittpunkt der Ebenen im Jupyter Notebook zu sehen und alle Ebenen schneiden sich bei a Punkt – Godekere

Verwandte Themen