数学模型作业(2)

原创内容,转载请注明来源

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 = []
    for a_co, b_co in zip(coords1, coords2):
        eu_dist = np.sqrt(np.sum((a_co-b_co)**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()

运行结果:

猜你喜欢

转载自blog.csdn.net/qq_40678163/article/details/108923006