Параметрический 3D-график поверхности с цветом в зависимости от (x, y, z) - PullRequest
0 голосов
/ 06 мая 2019

Я хочу построить количество, которое задается на параметрической поверхности в трехмерном пространстве (например, распределение температуры по сфере).Я могу построить параметрический трехмерный график сферы (в зависимости от двух параметров phi и theta), но я не знаю, как сделать так, чтобы цвета многоугольников, составляющих сферу, зависели от параметров theta и phi (обычно цвет многоугольника просто определяется z-положением многоугольника).

Вот базовый пример, на котором изображен тор с картой цветов:

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

angle = np.linspace(0, 2 * np.pi, 32)
theta, phi = np.meshgrid(angle, angle)
r, R = .25, 1.
X = (R + r * np.cos(phi)) * np.cos(theta)
Y = (R + r * np.cos(phi)) * np.sin(theta)
Z = r * np.sin(phi)

# Display the mesh
fig = plt.figure()
ax = fig.gca(projection = '3d')
ax.set_xlim3d(-1, 1)
ax.set_ylim3d(-1, 1)
ax.set_zlim3d(-1, 1)
ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1,cmap="hot")
plt.show()

Однако цвета файлов задаются положением z плитки, я хочу, чтобы цвет задавался функцией f(x,y).

Кто-нибудь знает, как мне добиться этой зависимости в Matplotlib??

Большое спасибо!

1 Ответ

0 голосов
/ 06 мая 2019

Хорошо, если кто-то еще ищет решение этой проблемы, вот возможное решение:

Цвета отдельных граней, составляющих график поверхности, можно задать с помощью ключевого слова аргумент facecolors. Следующий код будет использовать функцию X**2+Y**2 для раскраски граней параметрической поверхности:

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

# Generate torus mesh
angle = np.linspace(0, 2 * np.pi, 32)
theta, phi = np.meshgrid(angle, angle)
r, R = .25, 1.
X = (R + r * np.cos(phi)) * np.cos(theta)
Y = (R + r * np.cos(phi)) * np.sin(theta)
Z = r * np.sin(phi)

colorfunction=(X**2+Y**2)
norm=colors.Normalize(colorfunction.min(),colorfunction.max())

# Display the mesh
fig = plt.figure()
ax = fig.gca(projection = '3d')
ax.set_xlim3d(-1, 1)
ax.set_ylim3d(-1, 1)
ax.set_zlim3d(-1, 1)
ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, facecolors=cm.jet(norm(colorfunction)))
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...