【问题标题】:What is the equivalent of Matlab's surf(x,y,z,c) in matplotlib?matplotlib 中 Matlab 的 surf(x,y,z,c) 的等价物是什么?
【发布时间】:2015-04-10 06:25:44
【问题描述】:

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

【问题讨论】:

  • 在matplotlib教程中没有找到像surf(x,y,z,c)这样的函数
  • 这确实不完全符合 SO 标准;包括您尝试过的内容以及为什么它没有奏效/等等。然后我们可以从那里帮助你。即使您说我阅读了文档并且只是无法理解它们,您也正在使它变得更好,而不是仅仅要求其他人做作业。
  • 这里是 mplot3d 教程中的specific function

标签: python matlab matplotlib


【解决方案1】:

我已经使用类似这样的代码完成了它(请参阅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()

【讨论】:

    【解决方案2】:

    您需要创建一个标量映射,它将存储在数组“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)
    

    【讨论】:

      【解决方案3】:

      这是一个结合其他两个答案(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
      

      【讨论】:

        猜你喜欢
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        相关资源
        最近更新 更多