如何使用Python绘制二维FEM(有限元)网格?

问题分析
你现有代码的核心问题如下:
- 目标是绘制2D填充网格,却误用了3D绘图组件,增加了不必要的复杂度
- 顶点坐标定义不全,连通性数组中用到的
4、5号索引超出了你现有4个顶点的范围,会直接报错 - 3D多边形集合类不适用2D网格绘制场景
实现方案
如果是要绘制基于节点数值的填充矩形网格,推荐使用matplotlib.collections.PolyCollection处理不规则四边形网格,或者直接用pcolormesh处理规则网格,以下是可运行的参考实现:
import matplotlib.pyplot as plt import numpy as np from matplotlib.collections import PolyCollection # 1. 定义所有顶点坐标,示例覆盖你写的连通性索引范围,可按需调整 vertices = np.array([ [0, 0.06], # 0号顶点 [25, 0.6], # 1号顶点 [25, 0.1], # 2号顶点 [0, 0.125], # 3号顶点 [25, 0.125], # 4号顶点 [25, 0.2] # 5号顶点 ]) # 2. 定义连通性:每个四边形对应的4个顶点索引 connectivity = np.array([[0,3,4,1],[1,4,5,2]]) # 3. 组装每个四边形的顶点 polys = vertices[connectivity] # 4. 定义每个网格对应的数值(用于填充颜色,和连通性顺序对应) cell_values = np.array([1.2, 3.5]) # 5. 绘图 fig, ax = plt.subplots() poly_col = PolyCollection(polys, edgecolor='black', cmap='viridis') poly_col.set_array(cell_values) ax.add_collection(poly_col) ax.autoscale() plt.colorbar(poly_col, label='节点对应数值') plt.show()
如果是规则的等距矩形网格,直接用pcolormesh更简单,示例如下:
import matplotlib.pyplot as plt import numpy as np # 生成规则网格坐标 x = np.linspace(0, 25, 5) y = np.linspace(0, 0.6, 4) X, Y = np.meshgrid(x, y) # 定义每个网格的数值 Z = np.random.rand(Y.shape[0]-1, X.shape[1]-1) plt.pcolormesh(X, Y, Z, edgecolor='black', cmap='viridis') plt.colorbar(label='数值') plt.show()
内容的提问来源于stack exchange,提问作者msci
相关产品推荐
相关产品推荐

