3d图的facecolor不起作用

时间:2016-09-29 14:45:44

标签: python-3.x

我是Python的新手,并尝试做一个3d绘图并用第四个变量为它着色。我使用facecolors,对于下面的一个例子,它不能正常工作。我有积极的价值,但facecolor只显示负面。如果有人对此有所了解,我们非常感激。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
from scipy import ndimage
import scipy.ndimage.filters

def RP_source(theta,phi,MT):

    x1 = np.sin(theta)*np.cos(phi)
    x2 = np.sin(theta)*np.sin(phi)
    x3 = np.cos(theta)
    #
    M11 = MT[0,0]   
    M22 = MT[1,1]   
    M33 = MT[2,2]
    M12 = MT[0,1]
    M23 = MT[1,2]
    M13 = MT[0,2]

    core = M11*x1*x1  + M22*x2*x2 +  M33*x3*x3 + 2*M12*x1*x2 + 2*M13*x1*x3 + 2*M23*x2*x3

    ## S-wave 
    # S-wave displacement RP 3-components
    us1 = (x1*M11 + x2*M12 + x3*M13) - x1*core
    us2 = (x1*M12 + x2*M22 + x3*M23) - x2*core
    us3 = (x1*M13 + x2*M23 + x3*M33) - x3*core

    # transform S-wave displacement vector to the spherical coordinate (r,theta, phi)
    USV = np.cos(theta)*np.cos(phi)*us1 + np.cos(theta)*np.sin(phi)*us2 - np.sin(theta)*us3;

    return  USV, us1, us2, us3 

####################################################################
phi = np.linspace(0., 360., 90)        # (degrees) azimuth angle with the x1-axis
theta = np.linspace(0., 180. ,45)      #(degrees) angle with x3-axis (assumes positive x3 upward)

# convert to radian
theta = np.radians(theta)
phi = np.radians(phi)

theta, phi = np.meshgrid(theta, phi)

st = np.sin(theta)
ct = np.cos(theta)
sp = np.sin(phi)
cp = np.cos(phi)

# generate the propagation ray vectror   
x1 = st*cp
x2 = st*sp
x3 = ct

# define moment-tensor matrix
MT = np.array([[0, 1., 0.],[1., 0., 0.],[0., 0., 0.]])

USV, us1,us2,us3 = RP_source(theta,phi,MT)

#########################
# first plot
scale = np.abs(USV)
x1_sv = scale*x1
x2_sv = scale*x2
x3_sv = scale*x3

fig =plt.figure()
ax1 = fig.gca(projection='3d')
surf1 = ax1.plot_surface(x1_sv,x2_sv,x3_sv,rstride=1, cstride=1, facecolors=cm.jet(USV), alpha=0.6)

plt.ylabel('y-axis')
plt.xlabel('x-axis')

m1 = cm.ScalarMappable(cmap=cm.jet)
m1.set_array(USV)
plt.colorbar(m1)

1 个答案:

答案 0 :(得分:0)

cm.jet想要一个区间[0, 1]中的数字。 将surf1 =...行替换为以下行:

surf1 = ax1.plot_surface(x1_sv,x2_sv,x3_sv,rstride=1, cstride=1, facecolors=cm.jet(USV-np.min(USV.ravel())), alpha=0.6)