Python 根据到达方位角绘制信号?

Python plot signals based on the azimuth of arrival?

我正在尝试绘制信号图,其中信号在图上的方向是信号来源的方位角。

我最初的想法是使用极坐标投影,但我实际上并不希望将信号本身转换为极坐标。

我试图通过使用极坐标投影图像作为子图网格的背景来补救极坐标转换,根据方位角旋转子图,类似于 link 中的内容:

这是我按照此工作流程使用 matplotlib 创建的绘图,显示了方位角相隔 45 度的信号。

这个情节是有点我想要的,但不完全是。它按方位角绘制信号,并且在没有实际极坐标转换的情况下仍然保留它们的幅度和频率。然而,这种方法非常骇人听闻且不可扩展——例如,很难以 30 度插入信号,而 135 和 225 度的信号根本不会出现。

我认为我的问题是我对问题的概念不正确。我在这里标记了 PyGMT,因为我知道有一种方法可以使用它来创建我想要的图,但事实证明,使用该库找到一个跳板示例对我来说很困难。非常感谢任何见解。

万一有人需要类似的东西,这就是我拼凑出来的东西。我使用 PyGMT 创建了我需要的图形——如果您还不熟悉通用映射工具 (GMT) 语法,那么学习它可能会很困难。下面是我创建的脚本,用于生成各种幅度和频率的随机信号序列,以及模拟它们的传播方向或到达方向的相应“方位角”。

干杯!

import numpy as np
import matplotlib.pyplot as plt
import pygmt
import pandas as pd

azimuths = np.arange(-180, 180, 45) # range of azimuths
time = np.linspace(0.5, 2*np.pi, 1000) # time vector (same for each)

# Amplitudes just calculated from random amplitude & frequency shifts 
amplitudes = [np.random.randn()*np.sin(np.random.randint(5,10)*time) for i in range(len(azimuths))]

# Create PyGMT Figure
fig = pygmt.Figure()

# Add a basemap to the figure from 0-360 degrees & a radius of 0-4
# projection='P20c+a10' means Polar projections 20 cm wide; +a means to set North as 0 & increase clockwise
# frame="pa30f15|sa15f5g45" sets the ticks around the outside of the polar plot
# pa30f15 --> primary axes mark major ticks 30 degrees apart and minor ticks every 15 degrees
# sa15f5g45 --> secondary major ticks every 15 degrees, secondary minor ticks every 5 degrees
#               with gridlines every 45 degrees
fig.basemap(region=[0,360,0,4], projection='P20c+a', frame="pa30f15|sa15f5g45")

# Loop over each azimuth and append to the plot each time
for i, az in enumerate(azimuths):
    if az <=180:
        # Each time we use wiggle to plot the data
        
        # Scale adjusts the height scale --> inverse? Decimal scales increase
        # amplitude on the plot
        fig.wiggle(
                   scale=1,
                   # x is the direction, x, y, z need the same shape
                   x=np.repeat(az,len(time)),
                   # Distance along our azimuth (follows the radius)
                   y=time,

                   # Actual amplitude of our wave
                   z=amplitudes[i],
                   # 0.5 point red pen
                   pen='0.5p,red'
                   )
    else:

        # If the azimuth is greater than 180, flip the sign of amplitude
        fig.wiggle(
                   scale=0.25,
                   x=np.repeat(az,len(time)),
                   y=time,
                   z=-amplitudes[i],
                   pen='0.5p,red'
                   )
         
# Shows the GMT plot using default pdf viewer
fig.show(method='external')