2017-10-20 2 views
0

Ich habe ein Skript, das einen Datensatz analysiert und dann xyz-Daten ausgibt. Um die Verteilung der Daten zu verstehen, möchte ich sie in einem 3D-Diagramm visualisieren. Da ich keine Erfahrung, was auch immer mit der Verwendung von matplotlib habe ich kopiert einfach den Code aus here und erwartet, dass es mit my text file zu arbeiten, die wie folgt aussieht:Matplotlib RuntimeWarning Anzeige eines 3D-Plots

-0.9 -0.9 483 
-0.9 -0.7 224 
-0.9 -0.5 156 
-0.9 -0.3 153 
-0.9 -0.1 174 
-0.9 0.1 268 
-0.9 0.3 95 
-0.9 0.5 59 
-0.9 0.7 50 
-0.9 0.9 199 
-0.7 -0.9 917 
-0.7 -0.7 244 
-0.7 -0.5 208 
-0.7 -0.3 148 
-0.7 -0.1 139 
-0.7 0.1 98 
-0.7 0.3 52 
-0.7 0.5 56 
-0.7 0.7 60 
-0.7 0.9 221 
... 

aber sobald ich das Skript starten, erhalte ich die folgenden Fehler, die dem colorbar führt falsch angezeigt wird:

Warning (from warnings module): 
    File "C:\Program Files\Python35\lib\site-packages\matplotlib\colors.py", line 496 
    cbook._putmask(xa, xa < 0.0, -1) 
RuntimeWarning: invalid value encountered in less 

Ferner weist die Handlung diese Dreiecke an seinen Rändern. Ich bin mir nicht sicher, ob sie auch eine Folge des oben genannten Fehlers sind. Diese ist die Ausgabe: enter image description here

Hier ist mein Code:

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

fig = plt.figure() 
ax = fig.gca(projection='3d') 

data = np.genfromtxt('plot.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

xi = np.linspace(-1, 1) 
yi = np.linspace(-1, 1) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi, interp='linear') 

surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.jet, 
        linewidth=1, antialiased=True) 

ax.set_zlim3d(np.min(Z), np.max(Z)) 

fig.colorbar(surf) 

plt.show() 

EDIT 1: ich den Quellcode bearbeitet xa vor der beanstandeten Zeile zu drucken, die Ausgänge:

[ nan nan nan nan nan nan nan nan nan nan nan 256. 
256. 256. 256. 256. 256. 256. 256. nan nan 256. 256. 256. 
256. 256. 256. 256. 256. nan nan 256. 256. 256. 256. 256. 
256. 256. 256. nan nan 256. 256. 256. 256. 256. 256. 256. 
256. nan nan 256. 256. 256. 256. 256. 256. 256. 256. nan 
nan 256. 256. 256. 256. 256. 256. 256. 256. nan nan 256. 
256. 256. 256. 256. 256. 256. 256. nan nan 256. 256. 256. 
256. 256. 256. 256. 256. nan nan nan nan nan nan nan 
nan nan nan nan] 

Also habe ich klar einige NaN-Werte hier, aber ich bin mir nicht sicher woher sie kommen .

+0

Dies ist eine Warnung, kein Fehler, damit Sie ein Grundstück erhalten tun aus. Es ist wirklich schwer zu wissen, was ohne ein Problem passiert, d. H. Wir haben keine Daten. Am besten versuchen Sie, einige Daten innerhalb des Codes zu generieren, um das Problem zu reproduzieren. – ImportanceOfBeingErnest

+0

Wenn Sie zum Quellcode gehen und 'print (xa)' vor die betreffende Zeile setzen, sehen Sie, dass das Array Nan-Werte enthält, weil Ihr 'Z' Nan Werte enthält. – Reti43

+0

@ImportanceOfBeingErnest Vielen Dank für Ihre schnelle Antwort und für die Bearbeitung meines Posts. Ich habe Ihnen meine Daten zur Verfügung gestellt. Der [Link oben] (https://pastebin.com/raw/UsQ5eArF) enthält alle xyz-Koordinaten, die ich habe. – TheJD

Antwort

1

Das Problem ist, dass griddata Daten für die Ränder des Rasters nicht produzieren kann. Dies wird intern umgangen, indem das Ausgangsarray maskiert wird. Für ein maskiertes Array ist jedoch ein Vergleich , der zur Ermittlung der Farben benötigt wird, nicht möglich.

Die Lösung hier wäre, die Kanten vom Plotten auszuschließen.

ax.plot_surface(X[1:-1,1:-1], Y[1:-1,1:-1], Z[1:-1,1:-1]) 

Komplettes Beispiel:

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

fig = plt.figure() 
ax = fig.gca(projection='3d') 

data = np.genfromtxt('plot.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

xi = np.linspace(-1, 1) 
yi = np.linspace(-1, 1) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi, interp='linear') 

surf = ax.plot_surface(X[1:-1,1:-1], Y[1:-1,1:-1], Z[1:-1,1:-1], 
         rstride=5, cstride=5, cmap=cm.jet, 
         linewidth=1, antialiased=True) 

ax.set_zlim3d(np.min(Z), np.max(Z)) 

fig.colorbar(surf) 

plt.show() 

enter image description here

+1

Während 'griddata' maskierte Arrays für Daten außerhalb Ihres Bereichs erzeugt, unterstützt' plot_surface' das noch nicht. Die Funktion befindet sich in der Datei 'site-packages \ mpl_toolkits \ mplot3d \ axes3d.py' und sie haben eine Notiz, um dies zu unterstützen. Im Moment tun sie einfach 'X, Y, Z = np.broadcast (X, Y, Z)', was jegliche Maskierung zerstört und Ihre Nan-Werte werden belichtet. – Reti43

Verwandte Themen