Как отобразить цвет как функцию расстояния до начала координат на графике 3D поверхности matplotlib?

#python #matplotlib

#python #matplotlib

Вопрос:

Я пытаюсь построить определенную функцию Q (theta, phi) в сферической координате, используя пакет matplotlib python. Я хочу, чтобы цвет отображался как функция расстояния до начала координат вместо координаты z. Есть ли способ сделать это? Вот код, который я использую для создания 3D-графика поверхности:

 %matplotlib notebook

fig = plt.figure(figsize=(12,12))

ax = fig.add_subplot(111, projection='3d')
X, Y = Q*np.sin(Theta)*np.cos(Phi), Q*np.sin(Theta)*np.sin(Phi)
Z = Q*np.cos(Theta)
ax.plot_surface(X, Y, Z, cmap=plt.cm.YlGnBu_r)
ax.set_zlim(-1, 1)
ax.set_ylim(-1, 1)
ax.set_xlim(-1, 1)
ax.set_xlabel('J_x')
ax.set_ylabel('J_y')
ax.set_zlabel('J_z')

plt.show()
  

Я не заработал достаточно репутации, чтобы опубликовать созданный мной график. Это похоже на график по этой ссылке:https://matplotlib.org/3.1.1/gallery/mplot3d/surface3d.html. Как вы можете видеть, цвет является функцией координаты z, а не расстояния от начала координат.

Ответ №1:

Вы должны указать facecolor в plot_surface , а не cmap .

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


fig = plt.figure()
ax = fig.gca(projection='3d')

# Make data.
X = np.arange(-5, 5, 0.25)
xlen = len(X)
Y = np.arange(-5, 5, 0.25)
ylen = len(Y)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2   Y**2)
Z = np.sin(R)

d = np.sqrt(X**2 Y**2 Z**2)
d = d/d.max()

# Plot the surface with face colors taken from the array we made.
surf = ax.plot_surface(X, Y, Z, facecolors=plt.cm.viridis(d), linewidth=0)

# Customize the z axis.
ax.set_zlim(-1, 1)
ax.w_zaxis.set_major_locator(LinearLocator(6))
  

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