在matplotlib中Matlab的surf(x,y,z,c)的等价物是什么?

时间:2014-03-04 15:04:05

标签: python matlab matplotlib

我想在matlab中实现像surf(x,y,z,c)这样的函数,这里xyz是坐标,c是变量值,我可以使用c来定义颜色。我不知道如何用matplotlib来实现它。

3 个答案:

答案 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/171761https://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