在Python中用axes3D绘制出三维离散点图之后,怎样把它变为三维表面图

在Python中用axes3D绘制出三维离散点图之后,怎样把它变为三维表面图,谢谢

在Python中,你可以使用matplotlib的plot_surface函数来创建三维表面图。这个函数需要三个参数:X,Y和Z,它们都是二维数组,表示表面图的坐标。

以下是一个简单的例子:

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

# 创建一个3D图形
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 创建数据
x = np.random.standard_normal(100)
y = np.random.standard_normal(100)
z = np.random.standard_normal(100)

# 先绘制离散点图
ax.scatter(x, y, z)

# 为了绘制表面图,我们需要将数据转换为二维
xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))
X, Y = np.meshgrid(xi, yi)
Z = np.array([np.mean(z[(x>=X[i,j]-0.5) & (x<=X[i,j]+0.5) & (y>=Y[i,j]-0.5) & (y<=Y[i,j]+0.5)]) for i,j in np.ndindex(X.shape)]).reshape(X.shape)

# 绘制表面图
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color='b', alpha=0.5)

plt.show()

在这个例子中,我们首先创建了一个3D图形,并生成了一些随机数据。然后,我们使用scatter函数绘制了离散点图。

为了绘制表面图,我们需要将数据转换为二维。我们使用numpy的linspace函数和meshgrid函数来创建一个网格,然后计算每个网格点的z值。

最后,我们使用plot_surface函数来绘制表面图。rstride和cstride参数控制行和列的步长,color参数控制颜色,alpha参数控制透明度。

请注意,这个例子中的方法是一种简单的方法来从离散点创建表面图,可能不适用于所有情况。在实际应用中,你可能需要使用更复杂的插值或平滑方法来创建表面图。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7534660
  • 你也可以参考下这篇文章:Python3利用Axes3D库画3D模型图
  • 您还可以看一下 刘国柱老师的3D图示Python标准自学教程入门篇课程中的 课后作业_第三题目讲解小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以使用mpl_toolkits.mplot3d库中的Axes3D对象来进行三维绘图。在绘制三维离散点图后,可以使用plot_surface()方法绘制表面图。具体步骤如下:

    1. 导入库和模块

      import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D

    2. 创建三维坐标系

      fig = plt.figure() ax = fig.add_subplot(111, projection='3d')

    3. 绘制散点图

      ax.scatter(X, Y, Z, c='r', marker='o')

    4. 绘制表面图

      ax.plot_surface(X, Y, Z)

    完整代码如下:

    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    import numpy as np
    
    # 生成数据
    x = np.random.randint(0, 10, 10)
    y = np.random.randint(0, 10, 10)
    z = np.random.randint(0, 10, 10)
    
    # 创建三维坐标系
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    # 绘制散点图
    ax.scatter(x, y, z, c='r', marker='o')
    
    # 绘制表面图
    ax.plot_surface(x, y, z)
    
    # 设置坐标轴标签
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')
    
    # 显示图形
    plt.show()
    

    需要注意的是,绘制表面图时需要X,Y,Z三个坐标轴上的值都是二维数组,可以使用np.meshgrid()函数将三个一维数组扩展为三个二维数组。另外,表面图的效果和数据分布有很大关系,可能会有溢出或空洞,需要针对具体情况进行调整。

    如果使用上述代码无法正常绘制表面图,也可以尝试使用Mayavi库等其他第三方库来绘制三维表面图。