如何在Plotly 3D曲面图中通过给定x、y坐标标记指定区域或边框
Plotly 3D高程曲面指定区域标记实现方法
可以仅通过提供若干x、y坐标完成区域标记需求,以下是基于你原有代码的修改方案:
实现逻辑
- 你只需准备目标区域的有序边界x、y坐标列表(闭合区域需保证最后一个坐标点和第一个点坐标完全一致,形成闭环)
- 我们通过已有的高程网格数据,计算每个边界点对应的实际z值,再用3D散点线将边界绘制在高程曲面之上即可,也可选择填充高亮整个区域
完整可运行代码
import plotly.graph_objects as go import pandas as pd import numpy as np from scipy.interpolate import interp2d # 用于插值计算边界点的z值 # 读取原始高程数据(你的原有逻辑不变) contour_data = pd.read_csv(r"C:\Elevation.xyz", delimiter=' ', names=["x","y","z"]) print(contour_data.head()) # 生成高程网格(你的原有逻辑不变) Z = contour_data.pivot_table(index='x', columns='y', values='z').T.values X_unique = np.sort(contour_data.x.unique()) Y_unique = np.sort(contour_data.y.unique()) X, Y = np.meshgrid(X_unique, Y_unique) # ------------------- 新增:区域标记部分 ------------------- # 1. 替换为你自己的目标区域边界x、y坐标列表,这里是示例坐标 area_boundary_x = [100, 200, 200, 100, 100] # 示例正方形区域x坐标,闭合所以最后回到起始点 area_boundary_y = [300, 300, 400, 400, 300] # 示例正方形区域y坐标 # 2. 插值计算每个边界点对应的高程z值 z_interp = interp2d(X_unique, Y_unique, Z, kind='linear') area_boundary_z = [float(z_interp(x, y)) for x, y in zip(area_boundary_x, area_boundary_y)] # 3. 生成3D边界轨迹 boundary_trace = go.Scatter3d( x=area_boundary_x, y=area_boundary_y, z=area_boundary_z, mode='lines', line=dict( color='red', # 边框颜色可自定义 width=4 # 边框粗细可自定义 ), name='目标区域' ) # 如果你需要填充高亮整个区域,可额外添加Mesh3d轨迹,不需要的话删掉这段即可 fill_trace = go.Mesh3d( x=area_boundary_x, y=area_boundary_y, z=area_boundary_z, color='yellow', opacity=0.5, # 半透明可以看到下方的地形 name='高亮区域' ) # ------------------- 新增部分结束 ------------------- # 绘制图像,把新增的轨迹加进data列表里 fig = go.Figure(data=[ go.Surface(z=Z,x=X_unique,y=Y_unique, name='高程地形'), boundary_trace, # fill_trace # 需要填充的时候取消注释即可 ]) fig.update_layout(title='Elevation', autosize=True, margin=dict(l=65, r=50, b=65, t=90)) fig.update_layout(scene=dict(aspectratio=dict(x=2, y=2, z=0.4))) fig.show(renderer="browser")
效果示例
原有高程图效果如下:
添加标记后,你可以得到带自定义样式边框的目标区域效果,也可根据需要调整颜色、透明度等参数。
内容的提问来源于stack exchange,提问作者MaxWolodin
相关产品推荐
相关产品推荐

