2017-10-03 2 views
0

Ich habe plot_surface verwendet, um eine konische Struktur mit Auf- und Ab-Teilen in 3D zu erstellen, siehe nachstehenden Code. Bei Blickwinkel azim=90. ist der untere Konus links heller und rechts dunkler. Man würde das Gleiche für den oberen Kegel erwarten, wenn die "Lichtquelle" von der linken Seite kommt. Der obere Konus hat jedoch eine entgegengesetzte Schattierung und bleibt auch für andere Betrachtungswinkel, die ich wähle.mplot3d: Änderung der Standardschattierung (entgegengesetzt) ​​

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.) 

Bei bestimmten Winkel (z. azim=45) beide Kegel sieht homogen, aber ich würde ihnen etwas (konsequent) Beleuchtung haben möchten. Danke im Voraus.

enter image description here

+0

Vielleicht erwarten Sie ein bisschen zu viel von einer Bibliothek, die für 3D-Plot entworfen wurde nie. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Ich sehe, ich bin fast zufrieden mit dem, was ich jetzt habe, nur neugierig, warum es einen Unterschied geben würde ... – Phyinmi

Antwort

0

Interessante hat man die unteren Kegel Parameter X[::-1], Y[::-1], -Zup[::-1] zu ändern, um die gleichen Schattierungs wie oben eine zu bekommen. Der vollständige Code unten.

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