Excel 数据处理

博客地址:https://www.cnblogs.com/zylyehuo/
2023 年高教社杯全国大学生数学建模竞赛题目 -- B 题 多波束测线问题
图表格式

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from openpyxl import load_workbook
from matplotlib.ticker import FuncFormatter
from sklearn.linear_model import LinearRegression

wb = load_workbook("附件.xlsx")

x = []
y = []
z = []

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

worksheet = wb.worksheets[0]

yy = -0.02
for line in worksheet.iter_rows(min_row=3):
    yy += 0.02
    xx = -0.02
    for ind in range(2, len(line)):
        xx += 0.02
        x.append(xx)
        y.append(yy)
        zz = line[ind].value
        z.append(zz / 1852)
        print(f"{line[ind].value:.2f},坐标为({xx:.2f},{yy:.2f})", end=' ')  # 索引值从 0 开始
    print()

# # 绘制散点图,x、y 和 z 作为坐标,小数点后两位精度
# 使用颜色映射根据 z 值着色
sc = ax.scatter(x, y, z, c=z, cmap='viridis', marker='o')
# 设置坐标轴标签
ax.set_xlabel('X-Label(MM)')
ax.set_ylabel('Y-Label(MM)')
ax.set_zlabel('Z-Value(NM)', labelpad=10)

# 设置图表标题
plt.title('Depth')


# 自定义刻度标签的显示格式
def format_func(value, tick_number):
    return f"{value:.2f}"


def format_func_z(value, tick_number):
    return f"{value:.5f}"


# 设置x、y、z轴的刻度标签格式
ax.xaxis.set_major_formatter(FuncFormatter(format_func))
ax.yaxis.set_major_formatter(FuncFormatter(format_func))
ax.zaxis.set_major_formatter(FuncFormatter(format_func_z))

# 添加颜色条
colorbar = plt.colorbar(sc, label='Z Value(NM)', pad=0.2)
colorbar.set_label('Z Value(NM)')

# 拟合切平面
# 创建一个 LinearRegression 模型
model = LinearRegression()

# 将 x 和 y 合并为一个特征矩阵
features = np.column_stack((x, y))

# 拟合模型
model.fit(features, z)

# 获取拟合的平面参数
coefficients = model.coef_
intercept = model.intercept_

a = coefficients[0]
b = coefficients[1]
c = 1.0

equation = f"z = {a:.5f} * x + {b:.5f} * y + {c:.5f}"
print(equation)

# 水平平面的法向量
horizontal_plane_normal = np.array([0, 0, 1])

# 计算两个法向量的点积
dot_product = np.dot([a, b, c], horizontal_plane_normal)

# 计算夹角(弧度)
angle_rad = np.arccos(dot_product / (np.linalg.norm([a, b, c]) * np.linalg.norm(horizontal_plane_normal)))

# 转换为角度
angle_deg = np.degrees(angle_rad)

print(f"夹角(弧度):{angle_rad:.2f}")
print(f"夹角(度):{angle_deg:.2f}")


# 定义一个函数来计算 z 值
def calculate_z(x_z, y_z):
    return coefficients[0] * x_z + coefficients[1] * y_z + intercept


# 绘制拟合的切平面
xx, yy = np.meshgrid(np.arange(min(x), max(x), 0.02), np.arange(min(y), max(y), 0.02))
zz = calculate_z(xx, yy)

# 绘制切平面
ax.plot_surface(xx, yy, zz, cmap='coolwarm', alpha=0.5)  # 使用 'coolwarm' 颜色映射,透明度0.5

# 显示图表
plt.show()
相关推荐
蹦蹦跳跳真可爱58912 分钟前
Python----神经网络(《Inverted Residuals and Linear Bottlenecks》论文概括和MobileNetV2网络)
网络·人工智能·python·深度学习·神经网络
微刻时光40 分钟前
影刀RPA开发-CSS选择器介绍
css·python·低代码·自动化·rpa·影刀rpa·影刀实战
程序员拂雨1 小时前
Python知识框架
开发语言·python
灏瀚星空1 小时前
地磁-惯性-视觉融合制导系统设计:现代空战导航的抗干扰解决方案
图像处理·人工智能·python·深度学习·算法·机器学习·信息与通信
Code_流苏1 小时前
《Python星球日记》 第72天:问答系统与信息检索
python·微调·问答系统·bert·应用场景·基于检索·基于生成
敲键盘的小夜猫1 小时前
深入理解Python逻辑判断、循环与推导式(附实战案例)
开发语言·python
Looooking2 小时前
Python 之 selenium 打开浏览器指定端口进行接续操作
python·selenium
Dreams°1232 小时前
【Python爬虫 !!!!!!政府招投标数据爬虫项目--医疗实例项目文档(提供源码!!!)!!!学会Python爬虫轻松赚外快】
分布式·爬虫·python·mysql·scikit-learn
郜太素2 小时前
PyTorch 中神经网络相关要点(损失函数,学习率)及优化方法总结
人工智能·pytorch·python·深度学习·神经网络·学习
L_cl2 小时前
【Python 算法零基础 2.模拟 ④ 基于矩阵】
python·算法·矩阵