проблема с генераторами для живого обновления графиков на python - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь создать скрипт для визуализации алгоритмов сортировки, и я сделал свою собственную версию быстрой сортировки, но я не знаю, как правильно использовать yield для работы моего алгоритма. Вот код.

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
from itertools import chain

def update_fig(vec, rects, number):
    for rect, val in zip(rects, vec):
        rect.set_height(val)


def quick_sort(vec):
    n = len(vec)
    if n <= 1:
        return vec
    pivot = vec[n//2]
    left = []
    right = []
    for i in range(n):
        if i == n//2:
            continue
        if vec[i] >= pivot:
            right.append(vec[i])
        else:
            left.append(vec[i])

    yield chain(quick_sort(left) , [pivot] , quick_sort(right))


vec = np.random.randint(1, 100, 30)
generator = quick_sort(vec)

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
bar_rects = ax.bar(np.arange(1, len(vec) + 1), vec, align='center')

anim = animation.FuncAnimation(fig, func=update_fig, fargs=(bar_rects, 1), frames=generator, 
interval=1, repeat=False)

plt.show()

, и это ошибка, которую я получаю:

Traceback (most recent call last):
  File "C:\Users\Usuario\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\cbook\__init__.py", line 216, in process
    func(*args, **kwargs)
  File "C:\Users\Usuario\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 953, in _start
    self._init_draw()
  File "C:\Users\Usuario\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 1732, in _init_draw
    self._draw_frame(next(self.new_frame_seq()))
  File "C:\Users\Usuario\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 1755, in _draw_frame
    self._drawn_artists = self._func(framedata, *self._args)
  File "C:\Users\Usuario\AppData\Local\Programs\Python\Python37\MyCodes\liveData.py", line 20, in update_fig
    rect.set_height(val)
  File "C:\Users\Usuario\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\patches.py", line 815, in set_height
    self._update_y1()
  File "C:\Users\Usuario\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\patches.py", line 745, in _update_y1
    self._y1 = self._y0 + self._height
TypeError: unsupported operand type(s) for +: 'int' and 'itertools.chain'

1 Ответ

0 голосов
/ 03 апреля 2020

Проблема, действительно, здесь:

yield chain(quick_sort(left) , [pivot] , quick_sort(right))

Вы предоставили итерируемое для целых чисел для FuncAnimation, но предоставленная вами функция анимации имеет другую сигнатуру. Пожалуйста, внимательно прочитайте их здесь . Вы должны предоставить правильные аргументы для привода update_fig.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...