如何用Plotly绘制含任意x,y对的不规则网格等高线图?
Plotly绘制非结构化网格等高线图的实现方法
Plotly原生的contour函数不直接支持非结构化(每个z对应任意x,y对)的网格数据,但可以通过插值将非结构化数据转换为规则网格来实现需求,具体步骤和代码示例如下:
步骤说明
- 将非结构化的x、y、z二维列表展平为一维数组,便于后续处理
- 使用插值工具(如
scipy.interpolate.griddata)生成规则分布的x、y网格坐标,并据此插值得到对应的z值 - 使用Plotly的
contour函数绘制转换后的规则网格数据
代码示例
import plotly.graph_objects as go import numpy as np from scipy.interpolate import griddata # 示例非结构化数据 x = [[1,2,3],[1.1,2.2,3.3],[1,1.5,3]] y = [[1,1.1,1],[2,2,2.2],[3,3.3,3]] z = [[1,2,3],[4,5,6],[7,8,9]] # 展平数据 x_flat = np.array(x).flatten() y_flat = np.array(y).flatten() z_flat = np.array(z).flatten() # 生成规则网格 xi = np.linspace(min(x_flat), max(x_flat), 100) yi = np.linspace(min(y_flat), max(y_flat), 100) xi, yi = np.meshgrid(xi, yi) # 插值得到规则网格的z值 zi = griddata((x_flat, y_flat), z_flat, (xi, yi), method='cubic') # 绘制等高线图 fig = go.Figure(data=go.Contour( x=xi[0], # 规则网格的x轴值(每一行相同) y=yi[:,0], # 规则网格的y轴值(每一列相同) z=zi, colorscale='Viridis' )) fig.update_layout(title='非结构化数据转换后的等高线图') fig.show()
补充说明
Plotly的contour要求输入的x和y必须是严格的规则网格(即每一行的x值完全一致,每一列的y值完全一致),这和Matplotlib直接支持非结构化数据的处理逻辑不同。通过插值转换后,就能用Plotly实现和Matplotlib类似的等高线绘制效果,插值方法可根据需求选择linear、cubic或nearest。
内容的提问来源于stack exchange,提问作者user171780
相关产品推荐
相关产品推荐

