在用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')
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()