Tôi muốn tạo một hoạt ảnh với matplotlib để giám sát sự hội tụ của một thuật toán phân cụm. Nó sẽ vẽ một phân tán dữ liệu của tôi khi được gọi là lần đầu tiên và vẽ các dấu ba chấm lỗi mỗi khi ô được cập nhật. Tôi đang cố gắng sử dụng canvas_copy_from_bbox()
và restore_region()
để lưu phân tán và sau đó vẽ một tập hợp các dấu ba chấm mới bất cứ khi nào tôi cập nhật cốt truyện. Tuy nhiên, mã chỉ vẽ các hình elip mới lên trên các hình elip cũ, mà không xóa ô trước đó trước. Tôi nghi ngờ, bằng cách nào đó cách tiếp cận này không hoạt động tốt với các lệnh Ellipse()
và add_path()
, nhưng tôi không biết cách khắc phục điều này.Xóa nền trong matplotlib bằng cách sử dụng wxPython
Đây là mã:
import wx
import math
from math import pi
from matplotlib.patches import Ellipse
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import \
FigureCanvasWxAgg as FigureCanvas
TIMER_ID = wx.NewId()
class _MonitorPlot(wx.Frame):
def __init__(self, data, scale=1):
self.scale = scale
wx.Frame.__init__(self, None, wx.ID_ANY,
title="FlowVB Progress Monitor", size=(800, 600))
self.fig = Figure((8, 6), 100)
self.canvas = FigureCanvas(self, wx.ID_ANY, self.fig)
self.ax = self.fig.add_subplot(111)
x_lims = [data[:, 0].min(), data[:, 0].max()]
y_lims = [data[:, 1].min(), data[:, 1].max()]
self.ax.set_xlim(x_lims)
self.ax.set_ylim(y_lims)
self.ax.set_autoscale_on(False)
self.l_data = self.ax.plot(data[:, 0], data[:, 1], color='blue',
linestyle='', marker='o')
self.canvas.draw()
self.bg = self.canvas.copy_from_bbox(self.ax.bbox)
self.Bind(wx.EVT_IDLE, self._onIdle)
def update_plot(self, pos, cov):
self.canvas.restore_region(self.bg)
for k in range(pos.shape[0]):
l_center, = self.ax.plot(pos[k, 0], pos[k, 1],
color='red', marker='+')
U, s, Vh = np.linalg.svd(cov[k, :, :])
orient = math.atan2(U[1, 0], U[0, 0]) * 180/pi
ellipsePlot = Ellipse(xy=pos[k, :], width=2.0 * math.sqrt(s[0]),
height=2.0 * math.sqrt(s[1]),
angle=orient, facecolor='none',
edgecolor='red')
self.ax.add_patch(ellipsePlot)
self.canvas.draw()
self.canvas.blit(self.ax.bbox)
Thay vì 'fig.canvas.blit (ax.bbox) 'người ta cũng có thể xem xét' fig.canvas.update()'. Theo [blog này] (http://bastibe.de/2013-05-30-speeding-up-matplotlib.html) nó cũng nhanh như nhau. Đối với tôi, nó giải quyết được vấn đề tràn bộ nhớ. –
@LucM - Đối với những gì nó có giá trị, điều đó phụ thuộc rất nhiều vào chương trình phụ trợ. 'fig.canvas.blit (updated_region)' sẽ nhanh hơn và hoạt động hoàn hảo với 'TkAgg' và một số phần phụ trợ phổ biến khác. Tuy nhiên, trên các chương trình phụ trợ khác, 'fig.canvas.update()' (làm mới toàn bộ khung hình) nhanh hơn vì việc đổ một vùng phụ không được hỗ trợ đầy đủ. Bất kể, nó là tốt để biết về cả hai. –
Điều đó sẽ thực sự hữu ích nếu tôi chuyển đổi phụ trợ. Tôi đã có một tràn bộ nhớ với blit khi sử dụng PyQt. –