2016-04-27 37 views

回答

1

目前,看起来有bug这是保持SurfacePlot的colors参数不起作用。除了纯色以外,任何表面都可能不得不走上这条路。因此,目前可能无法修改源代码。

对于它的价值,我相信如果这个错误是不存在以下将工作:

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) 

基本上,数据标准化为0和1之间,然后映射这些值到色彩表。这将返回一个RGB颜色的三维数组,您可以将其传递给SurfacePlot的colors参数。

+0

我试过这种方法,但我得到了一个错误,说'颜色必须是二维的,如果索引是无'您是否应该将此脚本添加到我的代码?这是我的代码:'fig = vp.Fig(show = False) cnorm = z/abs(amax(z)) colors = 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 = None),阴影='平滑' ,颜色=颜色)' –

+0

没错。你遇到了我提到的错误。该文件说,颜色数组必须是2D,但代码要求它是3D。但是,如果将数组平铺为2D,则会遇到一个错误,它会尝试访问尚未初始化的底层结构。所以,就像我说的。你可能不得不等待它被修复,或者自己修复它。您可以尝试vispy.scene中的Volume对象,该对象采用cmap参数 – orodbhen

+0

好。非常感谢,我会试试:) –

2

必须在每个顶点基础上设置颜色,即vertex_colors。一种可以实现的方式如下:

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() 

注意使用显式设置set_vertex_colors工作正常。不幸的是(错误可能)通过csurface(z, vertex_colors=c)运行没有错误,但没有改变每个顶点的颜色。结论:使用明确的set_vertex_colors