我想在matlab中实现像surf(x,y,z,c)
这样的函数,这里x
,y
和z
是坐标,c
是变量值,我可以使用c
来定义颜色。我不知道如何用matplotlib
来实现它。
答案 0 :(得分:5)
我使用这样的代码完成了它(参见Edgelines vanish in mplot3d surf when facecolors are specified):
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import matplotlib
from pylab import *
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
#Create X and Y data
x = np.arange(xmin, xmax, xstep)
y = np.arange(ymin, ymax, ystep)
X, Y = np.meshgrid(x, y)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=C, antialiased=True)
#Show the plot
plt.show()
答案 1 :(得分:4)
您需要创建一个标量贴图,该贴图将转换存储在数组中的值' C'变成颜色值:
from matplotlib.colors import Normalize
from matplotlib import cm
import matplotlib.pyplot as plt
# assuming X, Y, Z, C are given in correct format
# Z and C have same dimensions
min = C.min()
max = C.max()
# choose any colormap e.g. cm.jet, cm.coolwarm, etc.
color_map = cm.RdYlGn # reverse the colormap: cm.RdYlGn_r
scalarMap = cm.ScalarMappable(norm=Normalize(vmin=min, vmax=max), cmap=color_map)
# outputs an array where each C value is replaced with a corresponding color value
C_colored = scalarMap.to_rgba(C)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=C_colored, antialiased=True)
答案 2 :(得分:2)
这里是一个便利功能,它结合了另外两个答案(https://stackoverflow.com/a/22176126/171761和https://stackoverflow.com/a/23799389/171761),它允许你传入一个参数(一个栅格Z,如imshow)和一个颜色图,并计算X,Y和C(或者允许你传入Z,颜色图以及X,Y和C中的一些):
def surf(Z, colormap, X=None, Y=None, C=None, shade=None):
if X is None and Y is None:
X, Y = meshgrid_of(Z)
elif X is None:
X, _ = meshgrid_of(Z)
elif Y is None:
_, Y = meshgrid_of(Z)
if C is None:
C = Z
scalarMap = cm.ScalarMappable(norm=Normalize(vmin=C.min(), vmax=C.max()), cmap=colormap)
# outputs an array where each C value is replaced with a corresponding color value
C_colored = scalarMap.to_rgba(C)
ax = gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=C_colored, shade=shade)
return surf
def meshgrid_of(A):
xx, yy = meshgrid(range(shape(A)[1]), range(shape(A)[0]))
return xx, yy