频散曲线绘制

本文详细介绍了如何使用Python进行频散曲线的绘制,通过实例代码解析关键步骤,包括数据准备、导入绘图库、设置坐标轴以及添加图例等,帮助读者掌握在数据分析中绘制频散曲线的技能。
部署运行你感兴趣的模型镜像
作者:Sheaping
链接:https://www.zhihu.com/question/458713107/answer/1878851102
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

import numpy as np
import matplotlib.pyplot as plt
from obspy import read

# 读取面波数据并画图。
st = read('MASW_DATA/Sample_Data/*.SAC')
dt = st[0].stats.delta
data = []
scale = 0.05
dx = 2
plt.figure(figsize=(8, 6))
for i, tr in enumerate(st):
    d = tr.data
    data.append(d)
    t = np.arange(len(d)) * dt
    plt.plot(t, d*scale+(i+1)*dx, lw=1, color='b')
plt.xlabel('Time (s)')
plt.ylabel('Offset (m)')
plt.tight_layout()
plt.savefig('Surface_wave.png')
plt.show()

# 二维FFT。
d = np.array(data)
n = len(d[0])
# m为空间方向的采样点数,m增大可以让FK谱光滑一点,以达到插值效果。
m = len(d[:, 0]) * 5
D = np.zeros((m, n))
D[:len(d[:, 0])] = d
# 时间采样率。
fs = 1 / dt
# 空间采样率
xs = 1 / dx
# 频率 (赫兹)。
f = np.arange(-n//2, n//2) * fs / (n-1)
# 波数 (每米)。
k = 2 * np.pi * np.arange(-m//2, m//2) * xs / (m-1)
# 二维FFT。
fk = np.fft.fft2(D)

# 作图。
pmin = -10
P = abs(np.fft.fftshift(fk)); P /= P.max(); P = 10 * np.log10(P)
P2 = abs(fk); P2 /= P2.max(); P2 = 10 * np.log10(P2)

plt.figure(figsize=(11, 8))
plt.subplot(221)
plt.pcolormesh(f, k, P2, cmap='magma', vmin=pmin, vmax=0)
plt.xlabel('Frequency (s$^{-1}$)')
plt.ylabel('Wave number (2$\pi$m$^{-1}$)')

plt.subplot(222)
plt.pcolormesh(f, k, P, cmap='magma', vmin=pmin, vmax=0)
plt.plot([f[n//2], f[-1], f[-1], f[n//2], f[n//2]],
        [k[0], k[0], k[m//2], k[m//2], k[0]],
         lw=2, ls='--', color='r')
plt.xlabel('Frequency (s$^{-1}$)')
plt.ylabel('Wave number (m$^{-1}$)')

plt.subplot(223)
plt.pcolormesh(f[n//2:], k[:m//2], P[:m//2, n//2:],
               cmap='magma', vmin=pmin, vmax=0)
plt.xlabel('Frequency (s$^{-1}$)')
plt.ylabel('Wave number (m$^{-1}$)')

plt.subplot(224)
plt.pcolormesh(f[n//2:], abs(k[:m//2][::-1]), P[:m//2, n//2:][::-1],
               cmap='magma', vmin=pmin, vmax=0)
cbar = plt.colorbar()
cbar.set_label(r'FK spectra (dB)')
plt.xlim(0, 100)
plt.xlabel('Frequency (s$^{-1}$)')
plt.ylabel('Wave number (m$^{-1}$)')
plt.tight_layout()
plt.show()

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 绘制锚杆散曲线的方法与工具 绘制锚杆散曲线是边坡稳定性分析中的一个重要步骤,通常涉及数值模拟和数据可视化。以下方法可以用于实现这一目标: #### 方法一:使用专业软件 一些专业的地质仿真软件提供了绘制锚杆散曲线的功能。例如,GEO-SLOPE 软件支持通过其内置的模块进行边坡稳定性分析,并生成相关结果图表[^3]。具体步骤如下: - 在 GEO-SLOPE 中创建项目并定义几何模型、材料属性和边界条件。 - 添加锚杆相关的参数设置,如锚杆位置、长度和力学特性。 - 运行分析后,从结果中提取散曲线数据。 #### 方法二:编程实现 如果需要更高的灵活性,可以使用编程语言(如 Python 或 MATLAB)结合数值计算库来绘制锚杆散曲线。 ##### Python 实现示例 Python 提供了强大的科学计算和绘图库,例如 NumPy 和 Matplotlib,可以用于绘制散曲线。以下是一个简单的示例代码: ```python import numpy as np import matplotlib.pyplot as plt # 定义锚杆散曲线的参数 wavelengths = np.linspace(1, 100, 500) # 波长范围 frequencies = np.sqrt(wavelengths) # 示例率计算公式 # 绘制散曲线 plt.figure(figsize=(8, 6)) plt.plot(wavelengths, frequencies, label="锚杆散曲线", color="blue") plt.title("锚杆散曲线") plt.xlabel("波长 (m)") plt.ylabel("率 (Hz)") plt.legend() plt.grid(True) plt.show() ``` 此代码片段生成了一个基于假设公式的锚杆散曲线。实际应用中,需根据具体的物理模型调整率计算公式。 ##### MATLAB 实现示例 MATLAB 是工程领域常用的工具之一,适合进行数值分析和数据可视化。以下是一个 MATLAB 示例代码: ```matlab % 定义锚杆散曲线的参数 wavelengths = linspace(1, 100, 500); % 波长范围 frequencies = sqrt(wavelengths); % 示例率计算公式 % 绘制散曲线 figure; plot(wavelengths, frequencies, 'b-', 'LineWidth', 1.5); title('锚杆散曲线'); xlabel('波长 (m)'); ylabel('率 (Hz)'); legend('锚杆散曲线'); grid on; ``` 上述 MATLAB 代码实现了与 Python 示例类似的功能,可根据具体需求调整输入参数和计算逻辑。 #### 方法三:结合 CAD 和 GIS 工具 对于复杂形状的锚杆分布,可以利用 CAD 软件进行几何建模,并将数据导出到 GIS 工具(如 ArcMap)中进行进一步处理和可视化[^2]。这种组合方式适用于需要高精度几何建模的场景。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值