class MainFrame ( wx.Frame ):
def __init__(self,parent):
self.panel_chart = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
self.show_chart_button = wx.Button( self, wx.ID_ANY, u"SHOW", wx.DefaultPosition, wx.DefaultSize, 0 )
####################其他代码省略
pass
假如有一个这样的Frame,我需要到它上面的一个叫panel_chart 的panel上面作画,点击show按钮就显示,那么我需要做以下的事情。
添加figure和canvas的库
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
reimplement这个Frame
class MyFrame(MainFrame):
def __init__(self,parent):
super(MyFrame,self).__init__(parent)
self.fig = Figure() # 添加figure
gs = self.fig.add_gridspec(20, 1) # 分割这个figure为上下,可以做2张图
self.axes_up = self.fig.add_subplot(gs[:8,:])
self.axes_below = self.fig.add_subplot(gs[10:,:])
self.canvas = FigureCanvas(self.panel_chart,-1,self.fig) # panel上一个画布,画布上一个figure
self.canvas.SetSize(self.panel_chart.Size) # 让这个画布填充满这个panel
# 绑定工作
self.panel_chart.Bind(wx.EVT_SIZE, self.size_changed) # 当Frame大小发生变化,比如拖拽窗口,那么需要让这个画布继续填满panel,则需要重新修改大小
self.show_chart_button.Bind(wx.EVT_BUTTON, self.show_chart) # 显示画了什么
pass
def size_changed(self,event):
self.canvas.SetSize(self.panel_chart.Size)
# 如果只是更新大小,那么画布上的figure是没有进行更新的,所以需要刷新
self.canvas.draw()
self.canvas.flush_events()
event.Skip()
pass
def show_chart(self,event):
# 清除上一次做的图
self.axes_up.clear()
self.axes_below.clear()
legend = self.fig.legends
if len(legend) !=0:# 清除legend
legend.clear()
##############
#############
###########此处省略作图的细节
# 只显示下面那个图的legend,并且分5列显示,legend不显示在下图中,而是显示在figure中,这样,可以不用遮挡住下图的内容
handles = self.axes_below.axes.get_legend_handles_labels()
if len(handles) != 0:
self.fig.legend(loc=8, ncol=5, bbox_to_anchor=(0.5, 0.01), shadow=True, handles=handles[0])
# 作图后需要刷新才会显示
self.axes_up.relim()
self.axes_below.relim()
self.axes_up.autoscale_view()
self.axes_below.autoscale_view()
self.canvas.draw()
self.canvas.flush_events()
pass