import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import hsv_to_rgb import discretisedfield as df from pathlib import Path import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec from pprint import pprint import warnings warnings.filterwarnings('ignore') path = Path("/home/tlliu/matlab/") fnames = [] # for i in list(path.glob("str_-0.013*phi_0.0002*V/*R12_2*/STO*")):10000000_polar for i in list(path.glob("meron/meron/PTO_tip_0-0.1")): try: fnames.append(list(i.glob("polar_tip_-0.1.mat"))[-1]) except IndexError: pass pprint(fnames) # 物理参数配置 Nx, Ny, Nz = 128, 128, 25 dx = 1.0 # nm (x方向间隔) dy = 1.0 # nm (y方向间隔) dz = 0.2 # nm (z方向间隔) for fname in fnames: field = df.Field.fromfile(fname) # 提取数据数组(根据之前确认的正确方式) p_x = field.p_x.value p_y = field.p_y.value p_z = field.p_z.value # 计算颜色编码(与之前相同) abs_px = np.abs(p_x) abs_py = np.abs(p_y) abs_pz = np.abs(p_z) max_abs = np.maximum(np.maximum(abs_px, abs_py), abs_pz) color_hue = np.zeros_like(p_x) mask_px = (abs_px == max_abs) color_hue[(mask_px) & (p_x > 0)] = 60 color_hue[(mask_px) & (p_x <= 0)] = 120 mask_py = (abs_py == max_abs) color_hue[(mask_py) & (p_y > 0)] = 30 color_hue[(mask_py) & (p_y <= 0)] = 180 mask_pz = (abs_pz == max_abs) color_hue[(mask_pz) & (p_z < 0)] = 240 color_hue[(mask_pz) & (p_z >= 0)] = 0 # 物理坐标生成 x_phys = np.arange(0, Nx*dx, dx) # 0到127 nm y_phys = np.arange(0, Ny*dy, dy) # 0到127 nm # 降采样参数 step = 1 x_sub = x_phys[::step] y_sub = y_phys[::step] # 提取颜色数据子集 colors = color_hue[::step, ::step, 13].flatten() # 只取z=0层的颜色数据 # 转换为RGB h = colors / 360.0 rgb = hsv_to_rgb(np.stack([h, np.ones_like(h), np.ones_like(h)], axis=1)) hue_2d = color_hue[::step, ::step, 13].T # 关键转置操作 # 创建x-y平面图 plt.figure(figsize=(10, 8)) extent = [0, Nx*dx, 0,
时间: 2025-06-15 13:07:39 浏览: 16
<think>好的,用户想用Python的matplotlib和discretisedfield库绘制物理场数据的彩色矢量图。首先,我需要确认这两个库的用法和如何结合它们。
matplotlib的quiver函数可以画矢量图,但彩色矢量可能需要根据矢量长度或方向来上色。而discretisedfield库是用于处理离散化场数据的,可能需要先安装这个库,然后导入数据。
用户的需求是示例代码解析,所以应该分步骤解释。首先安装必要的库,然后创建或加载场数据。接着用discretisedfield处理数据,再用matplotlib绘制。颜色映射可能需要使用Normalize和Colormap来处理矢量的模长。
需要注意坐标轴和颜色条的设置,确保图表清晰。可能还需要引用之前关于matplotlib的参考资料,比如引用[2]和[3]中的示例。同时,要检查代码是否正确,比如导入语句、数据处理和绘图参数是否正确。
最后,生成相关问题,帮助用户深入理解,比如如何调整颜色映射或处理三维数据。要确保回答结构清晰,符合用户的要求。</think>要使用Python的`matplotlib`和`discretisedfield`库绘制物理场数据的彩色矢量图,可以通过以下步骤实现。代码将结合矢量方向、颜色映射和离散化场数据处理技术。
---
### 步骤解析与示例代码
#### 1. 安装依赖库
```bash
pip install matplotlib numpy discretisedfield
```
#### 2. 创建物理场数据
使用`discretisedfield`生成示例磁场数据:
```python
import discretisedfield as df
import numpy as np
# 定义三维网格
region = df.Region(p1=(0, 0, 0), p2=(50e-9, 50e-9, 1e-9))
mesh = df.Mesh(region=region, n=(50, 50, 1))
# 生成螺旋型磁场数据
def m_value(pos):
x, y, z = pos
return (0, np.sin(2 * np.pi * x / 50e-9), np.cos(2 * np.pi * y / 50e-9))
field = df.Field(mesh, dim=3, value=m_value, norm=1e3) # norm为归一化参数
```
#### 3. 提取数据并计算模长
```python
# 提取二维切片(z=0)
plane = field.plane(z=0)
# 提取坐标和矢量分量
x, y = plane.mesh.grid_points[:, :, 0, 0], plane.mesh.grid_points[:, :, 0, 1]
u = plane.array[:, :, 0] # x分量
v = plane.array[:, :, 1] # y分量
magnitude = np.sqrt(u**2 + v**2) # 矢量模长(用于颜色映射)
```
#### 4. 绘制彩色矢量图
```python
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
# 设置画布和颜色映射
fig, ax = plt.subplots(figsize=(10, 8))
norm = Normalize(vmin=magnitude.min(), vmax=magnitude.max())
cmap = plt.get_cmap('viridis')
# 绘制矢量图(颜色与模长关联)
quiver = ax.quiver(x, y, u, v, magnitude,
cmap=cmap,
norm=norm,
angles='xy',
scale_units='xy',
scale=0.8, # 调整箭头密度
width=0.004)
# 添加颜色条
cbar = fig.colorbar(quiver, ax=ax)
cbar.set_label('Magnetization Magnitude (A/m)')
# 标签与标题
ax.set_title('Magnetic Field Vector Plot')
ax.set_xlabel('X (nm)')
ax.set_ylabel('Y (nm)')
plt.grid(True)
plt.show()
```
---
### 代码解析
1. **数据生成**:`discretisedfield`用于定义三维网格和磁场分布,这里生成了一个螺旋型磁场用于演示[^3]。
2. **矢量颜色映射**:通过`magnitude`计算每个矢量的模长,并映射到`viridis`颜色条上,实现颜色与矢量强度的关联[^2]。
3. **可视化优化**:
- `scale=0.8`控制箭头密度,避免重叠;
- `width=0.004`调整箭头粗细;
- `angles='xy'`确保箭头方向与坐标系对齐。
---
### 效果示意图
输出图像将显示二维平面上的矢量分布,箭头方向表示磁场方向,颜色深浅表示磁场强度(例如蓝色为低强度,黄色为高强度)。
---
阅读全文
相关推荐


















