读取COMSOL导出的电场数据并绘制
创作时间:
作者:
@小白创作中心
读取COMSOL导出的电场数据并绘制
引用
CSDN
1.
https://blog.csdn.net/weixin_46188545/article/details/141615544
在使用COMSOL进行光学仿真时,经常需要观察并导出某一平面的电场强度数据。然而,由于COMSOL导出的数据通常是不规则网格(三角形面元),这给数据的可视化带来了一定的困难。本文将介绍如何使用Python对这些数据进行插值处理,将其转换为规则网格数据,并使用matplotlib进行可视化。
用COMSOL进行光学仿真时需要观察并导出某一平面的电场强度数据。COMSOL导出的数据由3列组成,分别是x坐标、y坐标和(x, y)处的数据值。由于很多情况下COMSOL使用三角形面元,且面元大小不均匀,因此导出的电场分布的坐标轴间隔也不均匀,不利于数据的可视化。
本文用插值法将数据整理到规则的网格内,以方便数据的保存和再可视化。
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
import math
############# 读取数据
file_path = "977.6nm_xz_normE.txt" # 指定文件路径
# 读取文件并按行处理
with open(file_path, 'r', encoding='utf-8') as file:
# 使用列表推导式按行读取文件,并按空格分隔每行
data = [line.strip().split() for line in file if not line.strip().startswith('%')]
data_float = [[float(item) for item in row] for row in data]# 使用嵌套列表推导式将每个字符元素转换为float
#print(data_float)# 输出结果
print(sum(len(row) for row in data_float))
# 将结果分别存储为三列
x = [row[0] for row in data_float]
y = [row[1] for row in data_float]
value = [row[2] for row in data_float]
############# 通过插值法将数据规整
# 获得坐标轴数据的最大值、最小值
x_min = min(x)
x_max = max(x)
y_min = min(y)
y_max = max(y)
# 创建规则网格
grid_x, grid_y = np.mgrid[math.floor(x_min):math.ceil(x_max):400j, math.floor(y_min):math.ceil(y_max):1000j] # 生成规则网格,100j 表示生成 100 个点
# 插值到规则网格
grid_z = griddata((x, y), value, (grid_x, grid_y), method='cubic')
############# 绘制结果
fig, ax = plt.subplots(figsize=(6, 10))# 创建一个图形和一组子图(1x1网格的子图)
ax.set_aspect('equal', adjustable='box')# 设置 x 轴和 y 轴的比例相同
# 绘制插值结果
contourf_figure = ax.contourf(grid_x, grid_y, grid_z, levels=100, cmap='viridis', alpha=1)
# 绘制原始数据点
scatter_figure = ax.scatter(x, y, c=value, s=10, edgecolor='k', marker='s', linewidth=1, cmap='viridis', label='Original positions')
cbar = fig.colorbar(contourf_figure, ax=ax)# 添加 colorbar
cbar.set_label('ewfd.normE')# 设置 colorbar 标签
# 添加标题和标签
ax.set_title('Two-dimensional\ninterpolation')
ax.set_xlabel('X (nm)')
ax.set_ylabel('Y (nm)')
ax.legend()
plt.savefig('plot.png', format='png', dpi=300, bbox_inches='tight')# 保存图形
plt.show()# 显示图形
通过下面的图片可以看到,插值后的场强分布变得更加均匀。
插值方法分为 linear,nearest 和 cubic 三种。通过运行下面的代码可以简单直观地了解它们的区别。
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
# 示例数据
points = np.array([[0, 0], [1, 0], [1, 1], [0, 1]])
values = np.array([0, 1, 2, 3])
# 网格数据
grid_x, grid_y = np.mgrid[0:1:100j, 0:1:100j]
# 使用不同插值方法进行插值
methods = ['linear', 'nearest', 'cubic']
# 创建图形
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for ax, method in zip(axes, methods):
# 插值
grid_z = griddata(points, values, (grid_x, grid_y), method=method)
# 绘制插值结果
c = ax.contourf(grid_x, grid_y, grid_z, cmap='viridis')
ax.scatter(points[:,0],points[:,1], c=values, s=500, edgecolor='k', marker='s', linewidth=2, cmap='viridis', label='Original positions')
ax.set_title(f'Method: {method}')
fig.colorbar(c, ax=ax)
plt.show()
结果图像
热门推荐
宝宝吃奶睡觉自带“呼噜呼噜”音效?可能是喉软化症
潮汕过年:一场独特的文化盛宴
潮汕过年必打卡:官塘鲜味鱼生&老姿娘粿汁
橄榄石PK石英:谁才是真正的硬度之王?
春节文化符号大揭秘:从历史演变到现代意义
探秘史前巨兽:十种令人惊叹的远古生物,总有一种你未曾见过
《陌生人事物》第四季上线,外星人题材再掀热潮
《苍穹浩瀚》:一部严谨的太空歌剧
《流浪地球》:开启中国科幻影视新纪元
蜂蜜、梨、白萝卜,谁才是缓解咳嗽的真正神器?
广州至郴州自驾游必备指南
Arduino自动浇灌系统制作教程
触控自动加水系统在农业灌溉中的应用
广州至郴州自驾游,打卡网红景点
广州至郴州自驾游攻略:打卡网红景点
广州出发1小时,邂逅南方最美草原:郴州仰天湖大草原自驾游全攻略
音乐人汤潮爆料,刀郎曾想进入主流音乐圈,被排挤后到苏州修行
主流乐坛大咖对刀郎的围堵:音乐与市场交锋下的文化对垒
北京南站交通高峰即将到来!哪些时段?如何疏导措施?一文悉知
无花果食疗方,秋冬养生必备!
无花果:天然药箱里的秘密武器
探秘东方智慧:十神、四柱与八字排盘的奥秘
如何让白发变黑发,六种方法可以促使白发变黑
有些中老年人,白发又会变黑,这是为什么?
人与人之间唯一的壁垒——认知!我们整天学习,究竟该学什么?
2型糖尿病怎么恢复c肽 c肽增加是糖尿病逆转了吗
2型糖尿病患者的C肽水平:作用、变化及恢复方法
温县温贤仁熟地黄:传承千年、古法炮制,绽放养生之光
零失败爆好吃东坡肉
熟地黄的功效与作用及现代应用方法