Tôi đang viết một ứng dụng wx/matplotlib và tôi đang gặp khó khăn đáng kể khi thêm công cụ mới vào thanh công cụ NavigationToolbar matplotlib.Thêm các chế độ điều hướng mới trong matplotlib
Về cơ bản, tôi muốn thêm công cụ để chọn (marquee, lasso, v.v.) sẽ chuyển đổi chế độ con chuột con được điều khiển. Tính đến nay tôi đã không thể tìm thấy bất kỳ tính năng mà sẽ cho phép tôi làm điều này một cách dễ dàng.
tôi, tuy nhiên, chỉ cần khám phá chức năng này trông giống như nó sẽ là hữu ích: http://matplotlib.sourceforge.net/api/axes_api.html?highlight=set_navigate_mode#matplotlib.axes.Axes.set_navigate_mode
Thật không may, như cảnh báo ngụ ý, nó không thực sự giúp tôi.
Có ai có đầu mối về cách thực hiện việc này không? Dưới đây là một ví dụ bị tước bỏ cho thấy tôi đã nhận được bao xa. Biểu tượng dấu trang được sử dụng thay cho biểu tượng lasso của tôi và tôi đã loại bỏ chức năng lasso cho ngắn gọn.
import wx
from matplotlib.patches import Rectangle
from matplotlib.widgets import Lasso
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
class ScatterPanel(FigureCanvasWxAgg):
'''
Contains the guts for drawing scatter plots.
'''
def __init__(self, parent, **kwargs):
self.figure = Figure()
FigureCanvasWxAgg.__init__(self, parent, -1, self.figure, **kwargs)
self.canvas = self.figure.canvas
self.SetMinSize((100,100))
self.figure.set_facecolor((1,1,1))
self.figure.set_edgecolor((1,1,1))
self.canvas.SetBackgroundColour('white')
self.subplot = self.figure.add_subplot(111)
self.navtoolbar = None
self.lasso = None
self.redraw()
self.canvas.mpl_connect('button_press_event', self.on_press)
self.canvas.mpl_connect('button_release_event', self.on_release)
def lasso_callback(self, verts):
pass
def on_press(self, evt):
if evt.button == 1:
if self.canvas.widgetlock.locked():
return
if evt.inaxes is None:
return
if self.navtoolbar.mode == 'lasso':
self.lasso = Lasso(evt.inaxes, (evt.xdata, evt.ydata), self.lasso_callback)
self.canvas.widgetlock(self.lasso)
def on_release(self, evt):
# Note: lasso_callback is not called on click without drag so we release
# the lock here to handle this case as well.
if evt.button == 1:
if self.lasso:
self.canvas.draw_idle()
self.canvas.widgetlock.release(self.lasso)
self.lasso = None
else:
self.show_popup_menu((evt.x, self.canvas.GetSize()[1]-evt.y), None)
def redraw(self):
self.subplot.clear()
self.subplot.scatter([1,2,3],[3,1,2])
def toggle_lasso_tool(self, evt):
if evt.Checked():
self.navtoolbar.mode = 'lasso'
#self.subplot.set_navigate_mode('lasso')
# Cheat: untoggle the zoom and pan tools
self.navtoolbar.ToggleTool(self.navtoolbar._NTB2_ZOOM, False)
self.navtoolbar.ToggleTool(self.navtoolbar._NTB2_PAN, False)
else:
self.navtoolbar.mode = ''
self.lasso = None
#self.subplot.set_navigate_mode('')
def get_toolbar(self):
if not self.navtoolbar:
self.navtoolbar = NavigationToolbar(self.canvas)
self.navtoolbar.DeleteToolByPos(6)
ID_LASSO_TOOL = wx.NewId()
lasso = self.navtoolbar.InsertSimpleTool(5, ID_LASSO_TOOL,
wx.ArtProvider.GetBitmap(wx.ART_ADD_BOOKMARK),
isToggle=True)
self.navtoolbar.Realize()
self.navtoolbar.Bind(wx.EVT_TOOL, self.toggle_lasso_tool, id=ID_LASSO_TOOL)
return self.navtoolbar
if __name__ == "__main__":
app = wx.PySimpleApp()
f = wx.Frame(None, size=(600,600))
p = ScatterPanel(f)
f.SetToolBar(p.get_toolbar())
f.Show()
app.MainLoop()
Cảm ơn, Adam
Chỉ cần một FYI cho bất kỳ ai đọc bài đăng này. Điều này được sử dụng để làm việc cho tôi quá, nhưng bây giờ với Matplotlib 1.2.0 tôi phải thay đổi hai trong số các dòng. 'self._NTB2_PAN' trở thành' self.wx_ids ['Pan'] ' và ' self._NTB2_ZOOM' trở thành 'self.wx_ids ['Zoom']' –