Dada a seguinte configuração,
N_r = 21; N_theta = 18; N_phi= 36;
r_index = N_r-1;
[phi,theta,r_sphere] = np.meshgrid(np.linspace(0,2*np.pi,N_phi),np.linspace(0,np.pi,N_theta),np.linspace(a,b,N_r));
X = r_sphere[:,:,r_index] * np.sin(theta[:,:,r_index]) * np.cos(phi[:,:,r_index]);
Y = r_sphere[:,:,r_index] * np.sin(theta[:,:,r_index]) * np.sin(phi[:,:,r_index]);
Z = r_sphere[:,:,r_index] * np.cos(theta[:,:,r_index]);
rho = 1/r_sphere**2*np.sin(theta)*np.cos(theta)*np.sin(phi)
Configurei minhas coordenadas 2D X, Y e Z convertidas de coordenadas esféricas e uma variável de densidade em coordenadas esféricas da qual desejo plotar uma casca esférica (em r_index). No Matlab, com as mesmas variáveis e configuração, consegui usar a surf()
função
surf(X,Y,Z,rho(:,:,r_index),"EdgeAlpha",0.2);
(além de algumas outras coisas como rótulos de eixo e barra de cores), consegui criar o seguinte gráfico 3D (ou acho que 4D?) em r=r_index:
Tentar usar o Matplotlib plot_surface()
ou não funciona, ou não estou obtendo minhas entradas corretamente:
fig1 = plt.figure(figsize=(16,9),dpi=80)
ax = fig1.add_subplot(projection = "3d")
surf = ax.plot_surface(X,Y,Z,rho[:,:,r_index])
Posso fazer isso funcionar usando plot_surface()
ou existe outra função de plotagem feita sob medida para o que estou tentando fazer?
EDIT: scatter()
parece me dar algo próximo
fig1 = plt.figure(figsize=(16,9),dpi=80)
ax = fig1.add_subplot(projection = "3d")
surf = ax.scatter(X,Y,Z,c=rho[:,:,r_index],cmap = mpl.colormaps['bwr'])
plt.colorbar(surf,ax = ax,shrink = 0.5,aspect = 5)
plt.show()
Ele habilmente configura a forma da superfície ao pegar X, Y e Z, e então eu posso definir c para colorir cada ponto de acordo com o intervalo de valores passados. Se eu pudesse fazer algo similar a isso para uma função como plot_surface()
. Provavelmente pode ser feito, eu só não sei quais seriam os argumentos de entrada exatos.
Experimente isto:
código completo:
Não tenho certeza se estou respondendo corretamente ao comentário da resposta aceita, mas copiei de:
codificação de cores usando escalar mapeável em matplotlib
Tentei:
saída:
dado que:
resulta em:
Estou usando o compilador Matplotlib online que é a versão Matplotlib: 3.8.4