axes3D投影的提取问题

在用python axes3D绘制出3D图形时,将该图投影到坐标轴上,怎样把这个带有投影的坐标轴平面提取出来,形成一个平面图形,谢谢
绘制出3D图形时,需要删除一部分的图形,应该用什么函数实现呢

在用Python的mpl_toolkits.mplot3d库中的axes3D绘制出3D图形并将其投影到坐标轴上后,可以使用以下方法将该带有投影的坐标轴平面提取出来形成一个平面图形:

使用matplotlib的FigureCanvasAgg类将图形输出为位图文件(例如PNG或JPG格式)。

使用Pillow或OpenCV等图像处理库读取位图文件,并将其转换为灰度图像。

使用图像处理库进行二值化、滤波等预处理操作,以去除图像中的噪声和干扰。然后,使用边缘检测算法(例如Canny算法)检测图像中的边缘,并将它们连接成一个封闭的轮廓。

对于得到的轮廓,使用cv2.approxPolyDP函数将其近似为一个多边形。这个多边形就是坐标轴平面的投影形状。

将多边形绘制到一个新的空白图像中,形成一个平面图形。可以使用matplotlib库中的imshow函数显示该平面图形。

关于删除绘制出的3D图形的一部分,可以使用Axes3D类中的patch属性来访问图形中的所有3D图形对象,然后使用remove方法来删除需要删除的对象。例如,要删除3D图形中的一个面,可以使用以下代码:

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 在3D图形中添加一个面
face = ax.plot_trisurf(x, y, z)
# 删除该面
face.remove()
plt.show()

回答整理自chatgpt,如果有帮助麻烦采纳一下,谢谢啦

可以使用 set_visible(False) 函数来隐藏不需要的部分。例如,如果要隐藏 x 轴和 y 轴上的刻度标签和轴线,可以使用以下代码:

python
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
如果要隐藏 z 轴,可以使用以下代码:

python
ax.w_zaxis.line.set_visible(False)
ax.set_zticks([])
如果要隐藏整个坐标轴,可以使用以下代码:

python
ax.axis('off')

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7534660
  • 你也可以参考下这篇文章:Python3利用Axes3D库画3D模型图
  • 除此之外, 这篇博客: python3__绘图__常用数据分析图形(热力图,雷达图,箱线图,平行坐标,3D图,混淆矩阵,饼状图)中的 9.3D散点图 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • from mpl_toolkits.mplot3d import Axes3D

    mplot3d模块中的Axes3D绘图类

    from matplotlib.ticker import LinearLocator, FormatStrFormatter

    ticker模块主要提供“刻度的划分”和“刻度值的格式化”

    matplotlib包中ticker模块中LinearLocator类(刻度划分)和FormatStrFormatter类(使用“%”来格式化轴刻度值)from matplotlib import cm

    matplot内置的色彩映射模块

    # ! /usr/bin/env python
    # coding:utf-8
    # python interpreter:3.6.2
    # author: admin_maxin
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    from sklearn.cluster import KMeans
    from sklearn import preprocessing
    from mpl_toolkits.mplot3d import Axes3D
    from matplotlib import cm
    plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置显示字体
    plt.rcParams["axes.unicode_minus"] = False  # 设置正常显示符号
    
    data = pd.read_csv("data1.csv", encoding="utf-8", header=0, index_col=0)
    X = data
    # X = preprocessing.minmax_scale(X)
    # X = pd.DataFrame(X)
    
    # 构造聚类模型
    estimator = KMeans(n_clusters=3)
    estimator.fit(X)
    label_pred = estimator.labels_
    
    # 绘制k-means结果
    x0 = X[label_pred == 0]
    x1 = X[label_pred == 1]
    x2 = X[label_pred == 2]
    # x3 = X[label_pred == 3]
    
    # 绘制三维散点图
    fig = plt.figure()
    # ax = fig.add_subplot(111, projection='3d')
    ax = Axes3D(fig)
    
    # x,y,s要求是list等的array_list类型的数据
    ax.scatter(list(x0.iloc[:, 0]), list(x0.iloc[:, 1]), list(x0.iloc[:, 2]), c="red", marker='o', label='label0')
    ax.scatter(list(x1.iloc[:, 0]), list(x1.iloc[:, 1]), list(x1.iloc[:, 2]), c="green", marker='*', label='label1')
    ax.scatter(list(x2.iloc[:, 0]), list(x2.iloc[:, 1]), list(x2.iloc[:, 2]), c="blue", marker='+', label='label2')
    # ax.scatter(list(x3.iloc[:, 0]), list(x3.iloc[:, 1]), list(x3.iloc[:, 2]), c="pink", marker='x', label='label3')
    
    ax.set_xlabel('属性个数')
    ax.set_ylabel('标签个数')
    ax.set_zlabel('样本量')
    
    data["label"] = "0"
    for i in range(data.shape[0]):
        data.iloc[i, 3] = list(estimator.labels_)[i]
    data.to_csv("mydata.csv", sep=",", header=True, index=True, encoding="utf-8")
    
    plt.legend()
    plt.show()

     

  • 您还可以看一下 刘国柱老师的3D图示Python标准自学教程入门篇课程中的 运算符的优先级小节, 巩固相关知识点