Контур графика Matplotlib на трехмерной поверхности

Я пытаюсь использовать функцию цветовой карты графика 3D-поверхности в matplotlib для окрашивания поверхности на основе значений из другого массива вместо значений z. Поверхностный график создается и отображается следующим образом:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def gauss(x, y, w_0):
    r = np.sqrt(x**2 + y**2)
    return np.exp(-2*r**2 / w_0**2)


x = np.linspace(-100, 100, 100)
y = np.linspace(-100, 100, 100)
X, Y = np.meshgrid(x, y)
Z = gauss(X, Y, 50)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(X, Y, Z, cmap='jet')

Теперь вместо окрашивания на основе высоты 3d-поверхности я хочу предоставить данные цвета для поверхности в виде другого массива, например, случайного:

color_data = np.random.uniform(0, 1, size=(Z.shape))

Однако я не нашел решения раскрасить 3d-поверхность на основе этих значений. В идеале это выглядело бы как контурный график в 3D, только на 3D-поверхности.


person sunnytown    schedule 28.10.2019    source источник
comment
Используйте аргумент facecolors.   -  person ImportanceOfBeingErnest    schedule 28.10.2019
comment
Мне удалось сделать это так, как описано здесь: stackoverflow.com/questions/42924993/, однако, то, что я ищу, - это интерполяция значений цвета, как это делается в контуре, где вы можете установить количество уровней контура и т. д.   -  person sunnytown    schedule 28.10.2019


Ответы (1)


Вы можете использовать matplotlib.colors.from_levels_and_colors для получения цветовой карты и нормализации , а затем примените их к значениям, которые нужно преобразовать в цветовую карту.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.colors

x = np.linspace(-100, 100, 101)
y = np.linspace(-100, 100, 101)
X, Y = np.meshgrid(x, y)
Z = np.exp(-2*np.sqrt(X**2 + Y**2)**2 / 50**2)

c = X+50*np.cos(Y/20)  # values to be colormapped
N = 11                 # Number of level (edges) 
levels = np.linspace(-150,150,N)
colors = plt.cm.get_cmap("RdYlGn", N-1)(np.arange(N-1))
cmap, norm = matplotlib.colors.from_levels_and_colors(levels, colors)
color_vals = cmap(norm(c))

fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(X, Y, Z, facecolors=color_vals, rstride=1, cstride=1)
plt.show()

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 28.10.2019
comment
как можно добавить цветную полосу с цветами «c»? Спасибо - person jpcgandre; 22.06.2021