Как создать график цветовой карты, который может сделать сферу в matplotlib 3d похожей на половину яркого (похоже, что земля освещена с одной стороны) - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь создать трехмерную сферу в matplotlib и сделать так, чтобы ее цвет был похож на то, что одна сторона сферы освещена солнцем.

Я пробовал использовать цветовые карты matplotlib.

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_axis_off()
phi = np.linspace(0,2*np.pi, 50)
theta = np.linspace(0, np.pi, 25)
x=np.outer(np.cos(phi), np.sin(theta))
y=np.outer(np.sin(phi), np.sin(theta))
z=np.outer(np.ones(np.size(phi)), np.cos(theta))
PHI=np.outer(phi,np.ones(np.size(theta)))
THETA=np.outer(np.ones(np.size(phi)),theta)
data = PHI/np.pi
norm = plt.Normalize(vmin=data.min(), vmax=data.max()) 
surface=ax.plot_surface(x, y, z, cstride=1, rstride=1, 
                        facecolors=cm.jet(norm(data)))
surface=ax.plot_surface(x, y, z, cstride=1, rstride=1, 
                        facecolors=cm.binary(norm(data)),cmap=plt.get_cmap('jet'))
plt.show()

Я ожидаю, что сфера будет выглядеть примерно так: Или в основном что-то, что выглядит как земля с дневной и ночной стороны

Но вместо этого мои результаты примерно такие: текущий участок из вышеуказанного кода

1 Ответ

0 голосов
/ 14 июня 2019

Вам необходимо использовать пакет LightSource:

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_axis_off()
phi = np.linspace(0,2*np.pi, 100)
theta = np.linspace(0, np.pi, 50)
x=np.outer(np.cos(phi), np.sin(theta))
y=np.outer(np.sin(phi), np.sin(theta))
z=np.outer(np.ones(np.size(phi)), np.cos(theta))
PHI=np.outer(phi,np.ones(np.size(theta)))
THETA=np.outer(np.ones(np.size(phi)),theta)
data = PHI/np.pi
norm = plt.Normalize(vmin=data.min(), vmax=data.max())


# use Light Source
ls = LightSource(0, 0)
# create rgb shade
rgb = ls.shade(x, cmap=cm.Wistia, vert_exag=0.1, blend_mode='soft')
# blend shade
bsl = ls.blend_hsv(rgb, np.expand_dims(x*0.8, 2))
# plot surface
surface = ax.plot_surface(x, y, z, cstride=1, rstride=1, facecolors=bsl,
                       linewidth=0, antialiased=False, shade=False)


plt.show()

Вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...