2016-04-27 4 views

Antwort

1

Momentan scheint es einen bug zu geben, der den colors Parameter von SurfacePlot nicht funktioniert. Wenn man der Oberfläche alles andere als eine feste Farbe geben möchte, müsste man wahrscheinlich diesen Weg gehen. Es ist also zu diesem Zeitpunkt möglicherweise nicht möglich, den Quellcode zu ändern.

Für das, was es wert ist, glaube ich, die folgenden, wenn dieser Fehler nicht vorhanden war funktionieren würde:

import vispy.plot as vp 
from vispy import color 

fig = vp.Fig(show=False) 
cnorm = z/abs(np.amax(z)) 
colors = color.get_colormap("hsl").map(cnorm).reshape(z.shape + (-1,)) 
fig[0, 0].surface(z, x=x, y=y, colors=colors) 

Grundsätzlich Sie die Daten normalisieren ein zu zwischen 0 und 1, und ordnen dann diese Werte Farbkarte. Dadurch wird ein 3D-Array mit RGB-Farben zurückgegeben, die Sie an den Parameter colors von SurfacePlot übergeben können.

+0

Ich habe diesen Weg versucht, aber ich habe eine Fehlermeldung sagte 'Farben müssen 2D sein, wenn indiziert ist keine' Meinst du ich sollte dieses Skript zu meinem Code hinzufügen? Hier ist mein Code: 'fig = vp.Fig (show = Falsch) cnorm = z/abs (amax (z)) Farben = color.get_colormap (" cool "). Map (cnorm) .reshape (z.shape + (-1,)) p1 = scene.visuals.SurfacePlot (z = solver0 (I, f, c, bc, Lx, Ly, nx, ny, dt, 0, user_action = Keine), shading = 'smooth' , Farben = Farben) ' –

+0

Richtig. Du bist auf den Fehler gestoßen, den ich erwähnt habe. Die Dokumentation besagt, dass das Farbfeld 2D sein muss, aber der Code erfordert, dass es 3D ist. Wenn Sie jedoch das Array auf 2D reduzieren, wird ein Fehler auftreten, durch den versucht wird, auf eine zugrunde liegende Struktur zuzugreifen, die noch nicht initialisiert wurde. Also, wie ich schon sagte. Sie müssen wahrscheinlich darauf warten, dass es behoben wird, oder reparieren Sie es selbst. Sie könnten versuchen, das Volume-Objekt in vispy.scene, die ein cmap-Argument – orodbhen

+0

in Ordnung ist. Vielen Dank. Ich werde es versuchen :) –

2

Die Farben müssen auf einer Vertexbasis gesetzt werden, dh Vertex_colors. Eine Möglichkeit, dies zu erreichen, ist wie folgt;

import vispy.plot as vp 
from vispy import color 
from vispy.util.filter import gaussian_filter 
import numpy as np 

z = np.random.normal(size=(250, 250), scale=200) 
z[100, 100] += 50000 
z = gaussian_filter(z, (10, 10)) 

fig = vp.Fig(show=False) 
cnorm = z/abs(np.amax(z)) 
c = color.get_colormap("hsl").map(cnorm).reshape(z.shape + (-1,)) 
c = c.flatten().tolist() 
c=list(map(lambda x,y,z,w:(x,y,z,w), c[0::4],c[1::4],c[2::4],c[3::4])) 

#p1 = fig[0, 0].surface(z, vertex_colors=c) # why doesn't vertex_colors=c work? 
p1 = fig[0, 0].surface(z) 
p1.mesh_data.set_vertex_colors(c) # but explicitly setting vertex colors does work? 

fig.show() 

Beachten Sie die Verwendung des expliziten Setter set_vertex_colors hat gut funktioniert. Leider (möglicherweise ein Fehler) beim Übergeben c an surface(z, vertex_colors=c) lief ohne Fehler, aber änderte nicht die pro Vertex Farben. Fazit: Verwenden Sie explizit set_vertex_colors.