Как использовать цветовую карту в Vispy Surfaceplot

Я использую VisPy построить поверхность, но функцию scene.visuals.SurfacePlot имеет только параметр colorбез параметра colormap, Кто-нибудь знает, как использовать colormap в построении поверхности?

2 ответа

Решение

В настоящее время, кажется, есть ошибка, которая удерживает colors параметр SurfacePlot от работы. Чтобы придать поверхности что-либо кроме сплошного цвета, вероятно, придется пойти по этому пути. Так что это может быть невозможно в настоящее время без изменения исходного кода.

Для чего это стоит, я полагаю, что следующее работало бы, если бы этой ошибки не было:

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 параметр.

Нужно установить цвета для каждой вершины, то есть 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 работало нормально. К сожалению (возможно, ошибка) при прохождении c в surface(z, vertex_colors=c) работал без ошибок, но не менял цвета для каждой вершины. Вывод: используйте явное set_vertex_colors,

Другие вопросы по тегам