Librosa и matplotlib (с PyQt5) получают ошибку - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь создать волновую форму песни.И отобразить его в окне matplotlib, обернутом PyQt, но я продолжаю сталкиваться с ошибкой:

 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()

1 Ответ

0 голосов
/ 05 июня 2018

Эта проблема была решена путем установки в waveplot аргумента с ключевым словом ax, где вы задали ему оси.Вам не нужно ни хранить переменную col, ни add_collection.

librosa.display.waveplot(y, sr=sr, ax=self.axes)  
...