如何为有限元分析(FEM)中的多个多边形设置统一色阶填充
有限元分析可视化问题:统一颜色刻度解决方案
问题背景
进行有限元分析(FEM)时,结果可视化环节遇到如下问题:单个多边形(三角形、四边形)可正常按需求完成颜色填充,但添加第二个多边形后,颜色刻度会重置,导致同一节点的应力在不同区域呈现不同颜色。
原代码如下:
tri1 = np.array([[0.25,0.1],[1,2],[0.5,2]]) val1 = np.array([1,3,2]) tri2 = np.array([[0.5,2],[1,2],[1.2,3.75]]) val2 = np.array([2,3,6]) mat1 = np.c_[tri1,val1] mat2 = np.c_[tri2,val2] fig,ax = plt.subplots() def colourfill(mat_global,ax, label = None): import matplotlib.tri as tri triangulacion = tri.Triangulation(mat_global[:,0],mat_global[:,1]) pc = ax.tripcolor(triangulacion, mat_global[:,2], cmap='viridis', shading='gouraud') cbar = plt.colorbar(pc) cbar.set_label(label) colourfill(mat1,ax,'Testing') colourfill(mat2,ax) plt.show()
当前输出效果:两个三角形分别使用独立的颜色刻度,左侧三角形颜色对应数值范围1-3,右侧对应2-6,导致共享节点(如[0.5,2]、[1,2])在两个区域显示颜色不一致,且生成了两个重复的色条。
问题原因
每次调用colourfill函数时,都会创建新的colorbar,并且tripcolor默认根据当前传入的数据范围自动设置颜色映射的最小值(vmin)和最大值(vmax),导致不同多边形的颜色刻度不统一。
解决方案
通过计算全局数据范围,强制所有绘图使用统一的vmin和vmax,并仅创建一次色条,实现颜色刻度统一和规范的色条输出。
修改后的代码:
import numpy as np import matplotlib.pyplot as plt import matplotlib.tri as tri tri1 = np.array([[0.25,0.1],[1,2],[0.5,2]]) val1 = np.array([1,3,2]) tri2 = np.array([[0.5,2],[1,2],[1.2,3.75]]) val2 = np.array([2,3,6]) mat1 = np.c_[tri1,val1] mat2 = np.c_[tri2,val2] fig,ax = plt.subplots() # 计算所有数值的全局范围 all_values = np.concatenate([val1, val2]) global_vmin = all_values.min() global_vmax = all_values.max() def colourfill(mat_global, ax, vmin, vmax): triangulacion = tri.Triangulation(mat_global[:,0], mat_global[:,1]) # 指定统一的颜色刻度范围 pc = ax.tripcolor(triangulacion, mat_global[:,2], cmap='viridis', shading='gouraud', vmin=vmin, vmax=vmax) return pc # 绘制两个三角形,共用全局颜色刻度 pc = colourfill(mat1, ax, global_vmin, global_vmax) colourfill(mat2, ax, global_vmin, global_vmax) # 仅创建一次规范色条 cbar = plt.colorbar(pc) cbar.set_label('Testing') plt.show()
关键修改说明
- 全局范围计算:合并所有多边形的数值数据,计算出全局的最小值和最大值,确保颜色映射覆盖整个数据集的范围。
- 统一颜色刻度:在
tripcolor中传入vmin和vmax参数,强制所有多边形使用同一颜色映射规则,避免刻度重置。 - 单一色条创建:将色条创建逻辑移到所有多边形绘制完成后,只生成一个规范的色条,避免重复。
内容的提问来源于stack exchange,提问作者Juan Diego Oliva
相关产品推荐
相关产品推荐

