wxPython panel上嵌套画布作图

本文介绍如何使用Matplotlib在wxPython应用中绘制图表。通过继承MainFrame类并重写部分功能,实现动态调整图表大小及点击按钮更新图表内容。文章详细展示了如何创建图表、设置子图、绑定事件处理程序等步骤。
摘要由CSDN通过智能技术生成
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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值