如何在VisPy surfaceplot中使用colormap

时间:2016-04-27 12:36:27

标签: python vispy

我正在使用VisPy绘制曲面,但函数scene.visuals.SurfacePlot只有参数color,而没有参数colormap。有谁知道如何在表面绘图中使用colormap

2 个答案:

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

注意使用显式setter set_vertex_colors工作正常。遗憾的是(可能是一个错误)将c传递给surface(z, vertex_colors=c)时没有错误地运行但没有改变每个顶点的颜色。结论:使用显式set_vertex_colors

答案 1 :(得分: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颜色的3D数组,您可以将其传递给SurfacePlot的colors参数。