1

我正在处理音频时间序列,并希望更好地标记正在绘制的区域。我相信这个问题对于在 中标记时间序列数据是一般性的matplotlib,但我也使用它librosa.display.waveplot来最初绘制波形可能很重要。目前,我可以使用librosaand matplotlib(在 jupyter 笔记本中)制作以下情节:

在此处输入图像描述

我想做如下的东西: 在此处输入图像描述

我使用的代码如下,其中x[1]是一个包含音频数据(可能是立体声)的简单向量,并且target_len是经过一些过滤重复 3 次的录音的长度。音频文件是使用导入的x, Fs = librosa.load("audiofile.wav", mono=False)

plt.figure(figsize=(12, 3))
librosa.display.waveplot(x[1], sr=Fs, color='black')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')
plt.axvspan(0, target_len, color = 'magenta', alpha=0.5, zorder=-100)
plt.axvspan(target_len, target_len*2, color = 'yellow', alpha=0.5, zorder=-100)
plt.axvspan(target_len*2, target_len*3,color = 'blue', alpha=0.5, zorder=-100)
plt.tight_layout()

我在音频波形正上方绘制矩形的尝试失败了,我能做的最好的事情是在 librosa 生成的音频图形上方创建另一个图形,使用补丁绘制一个矩形。不幸的是,矩形被放置在离我想要的地方太远的地方。

在此处输入图像描述

这个矩形的代码在这里(ax.axis('off')注释掉了,所以你可以看到这个图的位置很差):

from matplotlib.patches import Rectangle
fig = plt.figure(figsize=(12,3))
ax = fig.add_subplot(111) 
ax.add_patch(Rectangle((0.04, 0), 0.35, 0.05, facecolor="black"))
#ax.axis('off')
plt.tight_layout

同样,这个问题基本上是关于matplotlib图形注释,特别是关于如何注释librosa(或任何其他 matplotlib 消费者)制作的图。似乎librosa将它自己的一些格式应用于该图形,因此它与我尝试在其上方的新图形中绘制的内容不一致。

4

2 回答 2

2

我在自定义 matplotlib 方面不是很有经验。我通过参考这个页面创建了代码。我认为有更好的方法来调整手动设置的位置。

import librosa
import librosa.display
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import matplotlib as mpl

file_name = '/content/test.wav'
wav, sr = librosa.load(file_name, sr=44100)

target_len = 1.5

fig = plt.figure(figsize=(12,3))
ax = fig.add_subplot(111) 
librosa.display.waveplot(wav, sr, color='black')
ax.set_xlabel('Time (seconds)')
ax.set_ylabel('Amplitude')
ax.axvspan(0, target_len, color = 'magenta', alpha=0.5, zorder=-100)
ax.axvspan(target_len, target_len*2, color = 'yellow', alpha=0.5, zorder=-100)
ax.axvspan(target_len*2, target_len*3,color = 'blue', alpha=0.5, zorder=-100)
# t = fig.transFigure
# print(t)
a = ax.transAxes
print(a)
plt.text(0.25, 1.0, 'Audio 1', ha='center', va='top', transform=fig.transFigure)
plt.text(0.45, 1.0, 'Audio 2', ha='center', va='top', transform=fig.transFigure)
plt.text(0.70, 1.0, 'Audio 3', ha='center', va='top', transform=fig.transFigure)
rect1 = mpl.patches.Rectangle((0.0, 1.02), width=0.295, height=0.05, color="black", transform=ax.transAxes, clip_on=False)
rect2 = mpl.patches.Rectangle((0.30, 1.02), width=0.295, height=0.05, color="black", transform=ax.transAxes, clip_on=False)
rect3 = mpl.patches.Rectangle((0.60, 1.02), width=0.295, height=0.05, color="black", transform=ax.transAxes, clip_on=False)
ax.add_patch(rect1)
ax.add_patch(rect2)
ax.add_patch(rect3)
# plt.tight_layout()

plt.show()

BboxTransformTo(
    TransformedBbox(
        Bbox(x0=0.125, y0=0.125, x1=0.9, y1=0.88),
        BboxTransformTo(
            TransformedBbox(
                Bbox(x0=0.0, y0=0.0, x1=12.0, y1=3.0),
                Affine2D(
                    [[72.  0.  0.]
                     [ 0. 72.  0.]
                     [ 0.  0.  1.]])))))

在此处输入图像描述

于 2021-01-12T10:12:13.357 回答
1

axvspan接受两个可选参数yminymax,以相对于 Y 轴高度的单位表示。1.0 是 Y 轴的顶部,0.0 是 Y 轴的底部。所以尝试使用ymin=1.1ymax=1.2或类似的东西。

于 2021-01-12T09:35:50.053 回答