Librosa 和 matplotlib(使用 PyQt5)出现错误
Librosa and matplotlib (with PyQt5) getting error
我正在尝试制作歌曲的波形。并在 PyQt 包装的 matplotlib window 中显示它,但我一直遇到错误:
RuntimeError: Can not put single artist in more than one figure
这发生在我尝试做的时候:
self.axes.add_collection(col)
与我导入 pyplot 时不同,它不会在调用 waveform
时自行添加到绘图中。所以这就是问题所在,使用 add_collection,我可以 google 的唯一方法,对我来说效果不佳。
附加信息,col
是 PolyCollection
。
这是代码完整代码:
import sys
from PyQt5.QtWidgets import *
import librosa.display
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import os
import random
class WaveForm(FigureCanvas):
def __init__(self, parent=None):
dir_path = 'D:\Musikk\DLs\'
dir_content = os.listdir(dir_path)
file = os.path.join(dir_path, random.choice(dir_content))
# Replace file with any song you may have.
y, sr = librosa.load(file, mono=False, duration=None)
fig = Figure(figsize=(5, 2))
super().__init__(fig)
col = librosa.display.waveplot(y, sr=sr)
self.axes = fig.gca()
self.axes.add_collection(col)
self.draw()
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
form = WaveForm()
app.exec()
此问题已通过设置 waveplot 采用名为 ax 的关键字参数来解决,您可以在其中为其指定坐标轴。您不需要存储 col 变量,也不需要在其上存储 add_collection。
librosa.display.waveplot(y, sr=sr, ax=self.axes)
我正在尝试制作歌曲的波形。并在 PyQt 包装的 matplotlib window 中显示它,但我一直遇到错误:
RuntimeError: Can not put single artist in more than one figure
这发生在我尝试做的时候:
self.axes.add_collection(col)
与我导入 pyplot 时不同,它不会在调用 waveform
时自行添加到绘图中。所以这就是问题所在,使用 add_collection,我可以 google 的唯一方法,对我来说效果不佳。
附加信息,col
是 PolyCollection
。
这是代码完整代码:
import sys
from PyQt5.QtWidgets import *
import librosa.display
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import os
import random
class WaveForm(FigureCanvas):
def __init__(self, parent=None):
dir_path = 'D:\Musikk\DLs\'
dir_content = os.listdir(dir_path)
file = os.path.join(dir_path, random.choice(dir_content))
# Replace file with any song you may have.
y, sr = librosa.load(file, mono=False, duration=None)
fig = Figure(figsize=(5, 2))
super().__init__(fig)
col = librosa.display.waveplot(y, sr=sr)
self.axes = fig.gca()
self.axes.add_collection(col)
self.draw()
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
form = WaveForm()
app.exec()
此问题已通过设置 waveplot 采用名为 ax 的关键字参数来解决,您可以在其中为其指定坐标轴。您不需要存储 col 变量,也不需要在其上存储 add_collection。
librosa.display.waveplot(y, sr=sr, ax=self.axes)