如何在 VisPy surfaceplot 中使用颜色图

How to use colormap in VisPy surfaceplot

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

目前,似乎有一个 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 之间,然后将这些值映射到颜色图。这将 return 一个 RGB 颜色的 3D 数组,您可以将其传递给 SurfacePlot 的 colors 参数。

必须在每个顶点的基础上设置颜色,即 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.