Matplotlib 3DPlot Extra Linien, wenn Dimensionen nicht gleich sind

Betrachten Sie diese MWE:

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np from matplotlib import cm n = 15 m = 12 x = np.linspace(-5, 5, n) y = np.linspace(-5, 5, m) Z = np.zeros((m, n)) for i in xrange(m): for j in xrange(n): Z[i, j] = x[j]**2 + y[i]**2 ### Plot surface ### fig = plt.figure() ax = fig.add_subplot(111, projection='3d') X, Y = np.meshgrid(x, y) ax.plot_surface(X, Y, Z) ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('Z') plt.show() 

Beachten Sie insbesondere, dass die Abmessungen n und m nicht gleich sind. Die daraus resultierende Handlung hat einige seltsame Linien hängen, sowie seltsame Färbung: Grundstück

Was ist hier los und wie kann ich das verhindern?

One Solution collect form web for “Matplotlib 3DPlot Extra Linien, wenn Dimensionen nicht gleich sind”

Im Gegensatz zu 2D haben 3D-Plots in Matplotlib viele Mängel . Lassen Sie mich eine der Antworten in matplotlib zitieren FAQ:

Dies ist wahrscheinlich das am häufigsten gemeldete Problem mit mplot3d. Das Problem ist, dass – aus einigen Blickwinkeln – ein 3D-Objekt vor einem anderen Objekt erscheinen würde, obwohl es physisch dahinter steckt. Dies kann zu Plots führen, die nicht "physisch korrekt" aussehen.

Leider, während einige Arbeiten getan werden, um das Auftreten dieses Artefakts zu reduzieren, ist es derzeit ein unlösbares Problem und kann nicht vollständig gelöst werden, bis matplotlib 3D-Grafik-Rendering im Kern unterstützt.

Das Problem tritt aufgrund der Reduzierung von 3D-Daten bis hin zu 2D + z-order Skalar auf. Ein einzelner Wert repräsentiert die 3. Dimension für alle Teile von 3D-Objekten in einer Sammlung. Wenn also die Begrenzungsboxen von zwei Sammlungen sich schneiden, wird es möglich, dass dieses Artefakt auftritt. Weiterhin kann der Schnittpunkt zweier 3D-Objekte (wie Polygone oder Patches) nicht in der 2D-Rendering-Engine von matplotlib gerendert werden.

Dieses Problem wird wahrscheinlich nicht gelöst werden, bis OpenGL Unterstützung zu allen Backends hinzugefügt wird (Patches sind sehr willkommen). Bis dahin, wenn Sie komplexe 3D-Szenen benötigen, empfehlen wir die Verwendung von MayaVi.

Für Ihr besonderes Problem (und beachten Sie, dass ich nicht glaube, dass dies etwas mit verschiedenen Größen in jeder Richtung zu tun hat) würde ich Ihnen raten, Ihre Oberflächenform zu erhöhen (auch wenn künstlich) und spielen mit der Anzahl der Fortschritte, bis Sie erhalten Etwas, das zufriedenstellend ist:

 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np from matplotlib import cm n = 150 m = 120 x = np.linspace(-5, 5, n) y = np.linspace(-5, 5, m) Z = np.zeros((m, n)) for i in range(m): for j in range(n): Z[i, j] = x[j]**2 + y[i]**2 ### Plot surface ### fig = plt.figure() ax = fig.add_subplot(111, projection='3d') X, Y = np.meshgrid(x, y) ax.plot_surface(X, Y, Z,rstride=1, cstride=1) ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('Z') plt.show() 

, Was dazu führt:

Matplotlib Oberfläche mit rstrides und cstrides == 10

Das obige Beispiel gibt rstrides und cstrides einen Wert von 10. Sollten Sie es zu viel erhöhen (sagen wir 80) und das Problem wird offensichtlich:

Matplotlib Oberfläche mit rstrides und cstrides == 80

Andere Option ist für Sie, um die Empfehlung von matplotlib FAQ selbst zu folgen und Mayavi zu überprüfen. Beachten Sie jedoch, dass mayavi immer noch nicht unterstützt Python 3. Persönlich, wenn Sie etwas schnell zu arbeiten, würde ich empfehlen PyQtGraph .

  • Animiertes 3D-Balkendiagramm mit Python
  • Wie man mehrere Dichte-Plots auf der gleichen Figur in Python zu plotten
  • Matplotlib: Rasterintervall ändern und Tick-Labels angeben
  • Wie man eine pylab-figur in in-speicherdatei speichert, die in PIL-Bild gelesen werden kann?
  • Wie kann man die Umrissfarbe eines Knotens ändern?
  • Wie komme ich matplotlibs Figurenklasse?
  • Python Tkinter integriert Matplotlib in GUI
  • Wie man Streamlines mit Matplotlib mit 1-D-Arrays von X-Kabeln, Y-Schnüren, U-Komponenten und V-Komponenten aufgibt
  • Matplotlib: Ändere mathematische Schriftgröße und gehe dann zurück zum Standard
  • Wie werden Bilder mit Skimage gespeichert (Python)
  • Python matplotlib Kontur Plot logarithmische Farbskala
  • Python ist die beste Programmiersprache der Welt.