原创内容,转载请注明来源
https://blog.csdn.net/qq_40678163/article/details/108923006
不足之处请大佬指正!
题目:
请读取data1.xlsx,将B列,C列,D列E列,第3行到第615行的数据读取出来,赋值给data,data1.xlsx前三列是613个点的x,y,z坐标,第0个点是A点,第612个点是B点,data第4列的数据是其校正点的属性,1表示垂直校正点,0表示水平校正点。
请完成以下问题:
(a)画出这613个点的散点图,A点为红色圆点,B点为黄色圆点,垂直校正点为绿色+,水平校正点为蓝色^. (b)请画出A点到B点的直线,颜色为黑色,直线宽度为1. (c) 设选定的校正点的集合为node = [0, 503, 294, 91, 607, 540, 250, 340, 277, 612],请画出node中相邻两点之间的直线,颜色为红色,直线宽度为2
(d)将此图片保存为FigData1.jpg. (e)请根据data1.xlsx前三列中613个点的x,y,z坐标,计算这613个点中任意两点之间的欧式距离,并将这个613行613列的距离矩阵赋值给dist,将dist存 入Excel文件data2.xlsx中. (f) 提交要求: Python程序,运行截图,FigData1.jpg,data2.xlsx
import pandas as pd import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 指定xlsx的路径 path = r'F:\学习\2020-2021数学模型\作业2\data1.xlsx' # 读取data1文件,并重新定义列标签 df = pd.DataFrame(pd.read_excel(path, names=['编号', 'X坐标(单位: m)', 'Y坐标(单位:m)', 'Z坐标(单位: m)', '校正点类型'])) # 切片第1行到613行,第1列到第4列的数据,赋给data data = df.iloc[1:614, 1:5] # 重新生成索引,使得从0开始索引 data = data.reset_index(drop=True) # print(data.shape) 看data的形状 输出:(613, 4) # print(type(data)) 看转换前data的类型 输出:<class 'pandas.core.frame.DataFrame'> # 将data转换为N维数组 data = np.array(data) # print(type(data)) 看转换前data的类型 输出:<class 'numpy.ndarray'> # ------- a ------- # # 建立新的fihure并设置为3D fig = plt.figure() ax = Axes3D(fig) # 获取所有X,Y,Z的坐标以及点的属性 x = data[:, 0] y = data[:, 1] z = data[:, 2] prop = data[:, 3] # 根据属性绘制散点图 for i in range(0, 613): if prop[i] == 'A点': # 注意!data1的表格文件中 ’A‘ 和 ’点‘之间有空格,博主删掉了 ax.scatter(x[i], y[i], z[i], c='r', marker='o') elif prop[i] == 'B点': ax.scatter(x[i], y[i], z[i], c='y', marker='o') elif prop[i] == 1: ax.scatter(x[i], y[i], z[i], c='g', marker='+') elif prop[i] == 0: ax.scatter(x[i], y[i], z[i], c='b', marker='^') ax.set(xlabel="X", ylabel="Y", zlabel="Z") # plt.show() # ------- b -------# # 获取A,B两点的坐标 x_ab = [x[0], x[612]] y_ab = [y[0], y[612]] z_ab = [z[0], z[612]] # 绘制A,B两点之间的直线 ax.plot(x_ab, y_ab, z_ab, linewidth=1, c='k') # plt.show() # ------- c -------# node = [0, 503, 294, 91, 607, 540, 250, 340, 277, 612] # 定义空数组用来存放校正点 x_node = [] y_node = [] z_node = [] # 将校正点提取出来并连接相邻校正点 for j in node: x_node.append(x[j]) y_node.append(y[j]) z_node.append(z[j]) ax.plot(x_node, y_node, z_node, linewidth=2, c='r') # 保存绘制的图形 plt.savefig("FigData1.jpg") plt.show() # ------- d -------# # 定义欧式距离的函数 def eu_distance(coords1, coords2): eu_dist = np.sqrt(np.sum((coords1-coords2)**2)) return eu_dist # 定义613*613的空数组存放欧式距离 dist = np.zeros(shape=(613, 613)) for i in range(0, 613): for j in range(0, 613): dist[i][j] = eu_distance(data[i, 0:3], data[j, 0:3]) # 将计算的欧式距离写入到data2中 data2_save = pd.DataFrame(dist) writer = pd.ExcelWriter('data2.xlsx') data2_save.to_excel(writer, 'sheet1') writer.save()运行结果: