Происходит то, что вы каждый раз добавляете новые патчи на график, а затем рисуете их все при вызове self.canvas.draw()
.
Самое быстрое решение - просто позвонить self.canvas.draw_artist(ellipsePlot)
после добавления каждого патча и удалить вызов на self.canvas.draw()
В качестве простого, автономного примера:
# Animates 3 ellipses overlain on a scatterplot
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
import numpy as np
num = 10
x = np.random.random(num)
y = np.random.random(num)
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
line = ax.plot(x, y, 'bo')
fig.canvas.draw()
bg = fig.canvas.copy_from_bbox(ax.bbox)
# Pseudo-main loop
for i in range(100):
fig.canvas.restore_region(bg)
# Make a new ellipse each time... (inefficient!)
for i in range(3):
width, height, angle = np.random.random(3)
angle *= 180
ellip = Ellipse(xy=(0.5, 0.5), width=width, height=height,
facecolor='red', angle=angle, alpha=0.5)
ax.add_patch(ellip)
ax.draw_artist(ellip)
fig.canvas.blit(ax.bbox)
Однако это, вероятно, вызовет проблемы потребления памяти с течением времени, так как объект axes будет отслеживать всех артистов, добавленных к нему. Если ваши оси не зависают в течение длительного времени, это может быть незначительным, но вы должны по крайней мере знать, что это приведет к утечке памяти. Одним из способов решения этой проблемы является удаление художников эллипса с осей, вызывая ax.remove(ellipsePlot)
для каждого эллипса после их рисования. Тем не менее, это все еще немного неэффективно, так как вы постоянно создаете и уничтожаете художников эллипсов, когда вы можете просто обновить их. (Создание и уничтожение их вообще не требует больших накладных расходов, но это в основном стилистическая проблема ...)
Если количество эллипсов остается неизменным с течением времени, лучше и проще просто обновить свойства каждого объекта художника эллипса, а не создавать и добавлять новые. Это позволит избежать удаления «старых» эллипсов с осей, поскольку когда-либо будет существовать только то число, которое вам нужно.
В качестве простого, автономного примера этого:
# Animates 3 ellipses overlain on a scatterplot
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
import numpy as np
num = 10
x = np.random.random(num)
y = np.random.random(num)
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
line = ax.plot(x, y, 'bo')
fig.canvas.draw()
bg = fig.canvas.copy_from_bbox(ax.bbox)
# Make and add the ellipses the first time (won't ever be drawn)
ellipses = []
for i in range(3):
ellip = Ellipse(xy=(0.5, 0.5), width=1, height=1,
facecolor='red', alpha=0.5)
ax.add_patch(ellip)
ellipses.append(ellip)
# Pseudo-main loop
for i in range(100):
fig.canvas.restore_region(bg)
# Update the ellipse artists...
for ellip in ellipses:
ellip.width, ellip.height, ellip.angle = np.random.random(3)
ellip.angle *= 180
ax.draw_artist(ellip)
fig.canvas.blit(ax.bbox)