2013-02-28 10 views
9

Ich versuche, ein Wireframe-Diagramm nach dem Z-Wert zu färben. Ich kann keine Code-Beispiele im Internet finden.farbige Wireframe-Plot in Matplotlib

Hier ist ein Beispiel für eine Oberflächendarstellung, die die Farben hat ich will, und einen Drahtgitter-Plot, wo ich nicht verwalten kann, um die Farben auf den Linien zu erhalten:

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

# some numbers for the data 
P=12000 #W 
Q=1  #kg/s 
DT=3 #K 
cp=4169.32 #J/kgK 

dDT=np.logspace(-2,0,20,endpoint=True) 
dQ=Q*np.logspace(-3,-1,20,endpoint=True) 

# the plotting data 
m1,m2=np.meshgrid(dDT,dQ) 
err=cp*np.sqrt((m1*Q)**2+(m2*DT)**2)/P 

# the wiremesh plot that i need fixed 
fig=plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_wireframe(m1, m2, err, color=err/err.max(),cmap='jet') 
ax.set_xlabel('dDT') 
ax.set_ylabel('DQ') 
ax.set_zlabel('relative error') 

# the surface plot that has the colors i want 
fig = plt.figure() 
ax = fig.gca(projection='3d') 

surf = ax.plot_surface(m1, m2, err,rstride=1, cstride=1, cmap=cm.jet, 
    linewidth=0.1, antialiased=False) 

fig.colorbar(surf, shrink=0.5, aspect=5) 

ax.set_xlabel('dDT') 
ax.set_ylabel('DQ') 
ax.set_zlabel('relative error') 
plt.show() 

Vielen Dank für jede Hilfe!

+0

Mögliche Duplikat http://stackoverflow.com/questions/24909256/how-to-obtain-3d-colored-surface-via-python/24958192#24958192? – GBy

Antwort

6

Wenn Sie plot_wireframe verwenden, kann jede Zeile nur eine Farbe haben. Stattdessen können Sie plot_surface verwenden. Um plot_surface zum Festlegen der Edgecolors zu erhalten, müssen Sie ihm Facecolors zuweisen. Dann können Sie das Alpha der Facefarben auf Null setzen.

from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
from matplotlib import cm 

X, Y, Z = axes3d.get_test_data(0.2) 

# Normalize to [0,1] 
Z = (Z-Z.min())/(Z.max()-Z.min()) 

colors = cm.viridis(Z) 
rcount, ccount, _ = colors.shape 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X, Y, Z, rcount=rcount, ccount=ccount, 
         facecolors=colors, shade=False) 
surf.set_facecolor((0,0,0,0)) 
plt.show() 

z color wireframe

1

Ich hatte ein ähnliches Problem mit der Färbung und Größe Kreise nach einer Variablen, die auch nicht funktioniert. Meine Problemumgehung bestand also darin, die Werte der Variablen zu übernehmen und die Bins zu durchlaufen. Ich maskierte die Daten so, dass das Array mask nur die Daten mit Werten in diesem Bin enthielt.

ax.plot_wireframe(mask[i], ..., color="red") 
ax.plot_wireframe(mask[i], ..., color="blue") 
etc. 

Ich weiß, es ist nicht sehr elegant, aber in meinem Fall hat es den Job;)

+0

Entschuldigung, ich habe das nicht verstanden. Können Sie ein Codebeispiel posten? – user1805743

1

Vielleicht brauchen Sie plot_surface stattdessen verwenden?

import matplotlib.pylab as plt 
from matplotlib import cm 
from mpl_toolkits.mplot3d import Axes3D 

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

t = np.linspace(-3, 2, 31) 
s = np.linspace(-3, 2, 31) 

T, S = np.meshgrid(t, s) 

ax.plot_surface(T * T, sqrt2 * T * S, S * S, cmap=cm.jet, rstride=1, cstride=1) 

ax.set_xlabel('$t^2$') 
ax.set_ylabel('$\sqrt{2} s t$') 
ax.set_zlabel('$s^2$') 

ax.set_title('line $s = t$ in $\cal F$') 

plt.show() 

enter image description here