2017-10-03 3 views
0

J'utilisais plot_surface pour créer une structure conique avec des parties haut et bas en 3D, voir le code ci-dessous. Avec l'angle de vue azim=90., le cône inférieur est plus clair à gauche et plus foncé à droite. On pourrait s'attendre à la même chose pour le cône supérieur si la "source lumineuse" vient du côté gauche. Cependant, le cône supérieur a l'ombrage opposé et reste ainsi pour d'autres angles de vue que je choisis.mplot3d: modifier l'ombrage par défaut (opposé)

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure(figsize=(3,4)); 
ax = fig.add_subplot(111,projection='3d') 

theta = np.linspace(0,2*np.pi,360) 
r = np.linspace(0,1,100) 
T, R = np.meshgrid(theta, r) 

X = R * np.cos(T) 
Y = R * np.sin(T) 
Zup = np.sqrt(X**2 + Y**2) 

ax.plot_surface(X, Y, Zup, rstride=1, cstride=1, linewidth=0, 
       antialiased=True,alpha=0.7,color='orange') 
ax.plot_surface(X, Y, -Zup, rstride=1, cstride=1, linewidth=0, 
       antialiased=True,alpha=0.7,color='orange') 

ax.set_axis_off() 
ax.view_init(elev=4., azim=90.) 
ax.dist=6 

fig.tight_layout(pad=0.) 

À certain angle (par exemple. azim=45), les deux cônes semble homogène mais je voudrais qu'ils aient une (cohérente) l'éclairage. Merci d'avance.

enter image description here

+0

Peut-être que vous attendez un peu trop d'une bibliothèque qui n'a jamais été conçu pour 3D tracé. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Je vois, je suis presque satisfait de ce que j'ai maintenant, juste curieux de savoir pourquoi il existe une différence ... – Phyinmi

Répondre

0

intéressant, il faut modifier les paramètres de cône inférieur à X[::-1], Y[::-1], -Zup[::-1] pour obtenir le même ombrage que celui du haut. Code complet ci-dessous.

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure(figsize=(2,2.6)); 
ax = fig.add_subplot(111,projection='3d') 

theta = np.linspace(0,2*np.pi,360) 
r = np.linspace(0,1,100) 
T, R = np.meshgrid(theta, r) 

X = R * np.cos(T) 
Y = R * np.sin(T) 
Zup = np.sqrt(X**2 + Y**2) 

ax.plot_surface(X, Y, Zup, rstride=1, cstride=1, linewidth=0, 
antialiased=True,alpha=0.7,color='orange') 
# fix here 
# have to reverse the lists to get the same shading 
ax.plot_surface(X[::-1], Y[::-1], -Zup[::-1], rstride=1, cstride=1, 
linewidth=0, antialiased=True,alpha=0.7,color='orange') 

ax.set_axis_off() 
ax.view_init(elev=4., azim=90.) 
ax.dist=6 

fig.tight_layout(pad=0.) 

enter image description here