首页 > 编程语言 >wxpython使用matplotlib.pyplot绘制GUI嵌入式统计图

wxpython使用matplotlib.pyplot绘制GUI嵌入式统计图

时间:2023-06-20 11:12:43浏览次数:65  
标签:plt Figure 统计图 pyplot matplotlib ax 图形 self Drawdata

在使用wxpython编写GUI时,如果需要在GUI上显示统计图,这里就可以用到matplotlib.pyplot;

一、首先就是导入matplotlib.pyplot模块

from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
import matplotlib.pyplot as plt

然后就需要一个容器,可以理解为桌子(容器)(Figure对象是图形的容器),来放置这一张画;

然后就需要一张宣纸,用来绘制目标统计图(FigureCanvas即FigureCanvasWxAgg 对象负责实际进行绘图)。

     
     # 设置一个带滚动条的panel
     self.m_pane6122 = wx.ScrolledWindow( self.m_pane612, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
     # 添加一个布局垂直管理器
     self.gSizer21 = wx.BoxSizer( wx.VERTICAL)
# 创建一个 Figure 对象和一个绘制统计图的 Canvas 对象 self.figure = plt.figure() #创建一个绘图的桌子 self.figure.set_facecolor("#ff2e63") # 统计图的背景颜色设置(容器) self.canvas = FigureCanvas(self.m_pane6122, -1, self.figure)# 铺开绘图的宣纸
     self.gSizer21.Add( self.canvas, 0, wx.EXPAND |wx.ALL, 0 ) # 将目标统计图的区域加入布局器中(将字画裱在画框中)
     self.m_pane6122.SetScrollbars(1, 1, 1, 1)# 必须设置滚动条大小,否则无法显示
        self.m_pane6122.SetSizer(self.gSizer21)# 将布局管理器与panel关联

Figure对象是Matplotlib库中的一个核心类,用于创建图形窗口和绘制各种类型的图形。它提供了一个绘图区域,可以在其中添加不同的绘图元素,如线条、散点图、柱状图等。

FigureCanvas(FigureCanvasWxAgg )对象则是将Figure对象与图形输出设备(如屏幕、图片文件、PDF文件)进行连接的类。它负责渲染Figure对象中的图形并将其显示或保存到指定的输出设备上。它是实现图形与外部环境交互的桥梁。

在以上代码中,通过创建Figure对象和将其与FigureCanvas(FigureCanvasWxAgg 对象关联,可以创建一个图形容器,并将该容器绑定到指定的控件(m_pane6122)上,以实现在该控件中显示图形的功能。同时,设置figure的背景颜色可以定制图形的外观,以符合特定的主题或需求。

可以这样理解:Figure对象类似于一个图形容器,它提供了一个空白的绘图区域,可以在其中添加各种绘图元素。它是图形的主要框架。

FigureCanvas(FigureCanvasWxAgg 对象则是图形的绘制工具,它将Figure对象中的图形渲染并输出到指定的设备上,例如屏幕或图片文件。它负责图形的绘制、显示和保存等操作。

通过将Figure对象与FigureCanvas(FigureCanvasWxAgg 对象进行关联,可以将图形绘制在指定的画布上,从而实现图形的展示和输出。这两个对象一起工作,构成了Matplotlib库中图形绘制的核心机制。

fig = plt.figure(figsize=(8, 6), dpi=80, facecolor='red')

对于Figure对象,可以使用matplotlib.figure.Figure类来创建。常用的参数包括:

  • figsize:指定图形的尺寸大小,以英寸为单位,默认为(6.4, 4.8)
  • dpi:指定图形的分辨率,即每英寸的像素数,默认为100
  • facecolor:指定图形的背景颜色,默认为'white'
  • edgecolor:指定图形的边框颜色,默认为'white'
canvas = FigureCanvasWxAgg(panel, -1, fig)

以下是一些常用的 FigureCanvasWxAgg 构建参数和说明:

  • parent:指定 FigureCanvasWxAgg 的父级容器,它必须是一个有效的 wxPython 对象。
  • id:指定 FigureCanvasWxAgg 的标识符(ID),默认为 -1
  • figure:指定关联的 Figure 对象,默认为 None。如果未提供,则在创建 FigureCanvasWxAgg 对象后需要手动设置。
  • size:指定 FigureCanvasWxAgg 的尺寸,以像素为单位,默认为 (640, 480)
  • dpi:指定 FigureCanvasWxAgg 的分辨率,即每英寸的像素数,默认为 80

二、图形构建函数

1、柱状图的绘制

def HistogramDraw(self,Drawdata): 
     Drawdata = [RDt,Rt,CDt,Ct,PName] #一个数据样例
     #设置主体字体样式,中文还是要设置一下,不然显示不出来  plt.rcParams["font.family"]="SimHei" # 示例数据 x = [u'延期评审', u'评审任务', u'延期普通', u'普通任务',u'任务总数'] y = [Drawdata[0],Drawdata[1],Drawdata[2], Drawdata[3],Drawdata[1]+Drawdata[3]] # 获取当前Figure中的Axes对象 ax = self.figure.axes # 如果Axes为空,则直接添加Axes if not ax: ax = self.figure.add_subplot(111) else: # 如果不为空,删除原有的Axes后添加 self.figure.delaxes(ax[0]) ax = self.figure.add_subplot(111)
#绘制bar图形(柱状图),并设置每个柱形的颜色 ax.bar(x,y,color=["#f6416c","#00b8a9","#ffde7d","#46cdcf","#3d84a8"]) ''' 详细解释如下: for rect in ax.patches: - ax.patches获取了当前Axes中的所有Patch对象,这里就是所有的柱子对象。 - 然后我们遍历每个柱子对象rect。 height = rect.get_height() - 调用rect对象的get_height()方法获取柱子的高度,也就是y值。 ax.text(rect.get_x() + rect.get_width()/2, height + 0.2, height, ha='center') - ax.text()方法在指定位置显示文本。我们想在柱子上方居中显示y值,所以: - rect.get_x() + rect.get_width()/2计算出柱子中心的x坐标。 - height + 0.2在y值的上方0.2单位的位置。 - 然后该位置显示高度height的值。 - ha='center'使文本水平居中。 ''' # 显示数据标签,在柱子上方显示y值 for rect in ax.patches: height = rect.get_height() ax.text(rect.get_x() + rect.get_width()/2, height + 0.5, height, ha='center') #设置x轴标签 ax.set_xlabel('任务类型')
     #设置y轴标签 ax.set_ylabel('数量')
     #设置统计图标题,背景颜色、字体颜色等 ax.set_title(Drawdata[4]+'任务统计',fontsize=18,backgroundcolor='#3c7f99', fontweight='bold',color='white',verticalalignment="baseline") # 更新 Canvas 显示柱状图(本次数据基础上的图形绘制) self.canvas.draw() self.m_pane6122.Layout() self.m_pane6122.Refresh()
     '''
     Layout(): 这个函数的作用是重新计算和调整控件的大小和位置,以确保它们适应容器的大小和布局。它会根据容器的大小、控件的约束条件和排列方式来重新布局控件,使它们按照设定的规则排列。
     Refresh(): 这个函数的作用是强制刷新界面,使最新的控件布局和内容更新立即生效。当界面上的控件发生变化或者需要更新时,调用这个函数可以使界面重绘,显示最新的变化。
     '''
  

2、饼图绘制

 def PieDraw(self,Drawdata): 
        #数据样例
        Drawdata = [RDt,Rt,CDt,Ct,PName]
     #必须设置主体字体,不然中文显示不出来(也有其他方式设置) plt.rcParams["font.family"]="SimHei"
     #判断分母是否为为零,避免异常(异常了原有的图就不会刷新,造成数据错乱) if Drawdata[1] != 0: # 示例数据 labels = [u'延期评审', u'按期评审'] sizes = [Drawdata[0],Drawdata[1]-Drawdata[0]] colors=["#ff461f","#46cdcf"] # 获取当前Figure中的Axes对象 ax = self.figure2.axes # 如果Axes为空,则直接添加Axes if not ax: ax = self.figure2.add_subplot(111) else: # 如果不为空,删除原有的Axes后添加 self.figure2.delaxes(ax[0]) ax = self.figure2.add_subplot(111)
#此函数用于处理基础数据值,用于显示到饼图 def make_autopct(values): def my_autopct(pct): total = sum(values) if total != 0: val = int(round(pct * total / 100.0)) else: val = 0 # 或者根据需求设置其他默认值 return '{p:.2f}% ({v:1.1f})'.format(p=pct,v=val) return my_autopct # 绘制饼图 ax.pie(sizes, autopct=make_autopct(sizes),colors=colors, shadow=False, startangle=90,labeldistance=1.2, pctdistance=0.85) #设置统计图标题、字号、背景、颜色等 ax.set_title(u'℃∑-评审任务统计',fontsize=18,backgroundcolor='#3c7f99', fontweight='bold',color='white',verticalalignment="baseline") #绘制图例(避免标签重合形成遮挡) ax.legend(labels=labels,loc="lower right",bbox_to_anchor=(0, 0),borderaxespad=1) # 更新 Canvas 显示柱状图 self.canvas2.draw() else:
       #这里会在分母为零的时候清除残留图 self.figure2.clear() # 清空面板内容 self.canvas2.draw() # 重新绘制面板 self.m_pane6122.Layout() self.m_pane6122.Refresh()
3、matplotlib支持很多种图形类型,主要可以分为:   1. 折线图: plt.plot()
  2. 条形图: plt.bar()
  3. 直方图: plt.hist()
  4. 散点图: plt.scatter()
  5. 箱线图: plt.boxplot()
  6. 饼图: plt.pie()
  7. 等高线图: plt.contour()
  8. 图像: plt.imshow()
  9. ...   总共matplotlib支持20几种图形类型。以上只是最常用的几种。具体可以参考[官方文档](https://matplotlib.org/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py)。 下面我们简单看看这几种图形的plot函数:**折线图**
python
plt.plot(x, y)             # 简单的 Plot
plt.plot(x, y, 'r--')      # 红色虚线
plt.plot(x, y, 'go--', linewidth=2, markersize=12)  # 标记点大小和线宽  
**条形图** 
python  
plt.bar(x, y)
plt.barh(x, y)            # 水平条形图
**直方图**
python
plt.hist(y)
plt.hist(y, bins=30)      # 指定直方图的 bin 数  
**散点图**
python
plt.scatter(x, y)
plt.scatter(x, y, c='r', marker='x')   # 散点设置为 red x  
**饼图**
python
plt.pie(y)
plt.pie(y, labels=x)      # 设置饼图标记为 x 
   

 

标签:plt,Figure,统计图,pyplot,matplotlib,ax,图形,self,Drawdata
From: https://www.cnblogs.com/babashi9527/p/17492906.html

相关文章

  • 软件测试|教你用matplotlib绘制热力图
    前言热力图,是一种通过对色块着色来显示数据的统计图表。绘图时,需指定颜色映射的规则。例如,较大的值由较深的颜色表示,较小的值由较浅的颜色表示;较大的值由偏暖的颜色表示,较小的值由较冷的颜色表示,等等。当然,只要我们提供数据,Python就能够绘制出热力图。下面我们就来介绍一下如何......
  • Python+matplotlib设置坐标轴文本标签排列方式
    在默认情况下,y轴的文本标签方向是下面这样的:有时候这样子不方便看,我们可能希望文字水平显示并且每行显示一个字,如下图:这时可以使用ylabel()函数的rotation属性设置为'horizontal'并通过手动插入换行符来实现。参考代码如下:公众号“Python小屋”x......
  • Python+matplotlib绘制海螺贝壳上美丽的线条
    封面图片:《Python可以这样学》,董付国著,清华大学出版社,2017,本书在台湾同时发行繁体版。=============在海洋中的亿万只海螺中,大部分都是右旋螺纹,从底部看的话海螺开口在右边,如下图所示:据说,在几千只海螺中也很难找到一只左旋海螺,非常稀少,但也不是没有,如下图:技术要点:使用Python+numpy+......
  • Python+matplotlib绘制三维图形5个精选案例
    如果要绘制三维图形,首先需要使用下面的语句导入相应的对象:frommpl_toolkits.mplot3dimportAxes3D然后使用下面的两种方式之一声明要创建三维子图:ax=fig.gca(projection='3d')ax=plt.subplot(111,projection='3d')接下来就可以使用ax的plot()方法绘制三维曲线、plot_surface......
  • Python文件操作与matplotlib数据可视化案例一则
    问题描述:某商场开业三个月后,有顾客反应商场一楼的手机信号不好,个别收银台有时无法正常使用微信支付或支付宝,商场内也有些位置无法正常使用微信。为此,商场安排工作人员在不同位置对手机信号强度进行测试以便进一步提高服务质量和用户体验,测试数据保存于文件“D:\服务质量保证\商场一......
  • Python+matplotlib绘制动态更新的柱状图
    问题描述:编写程序,生成测试数据,绘制水平柱状图,然后每隔0.5秒更新一次数据并实时根据最新数据绘制水平柱状图。参考代码:运行效果:公众号“Python小屋”......
  • Python+matplotlib绘制背景色和坐标轴刻度变化的动态柱状图
    问题描述:已知某商品从2000年至2019年每年12个月的价格波动情况,要求绘制动态柱状图进行可视化,要求每年改变一次轴域背景色。参考代码:运行效果:公众号“Python小屋”......
  • Python+matplotlib绘制动态折线图
    问题描述:动态绘制折线图。参考代码:运行效果:公众号“Python小屋”......
  • Python+matplotlib实现鼠标跟随的动态距离标注
    问题描述:显示一幅图像,鼠标左键按下后移动时实时显示当前位置与鼠标按下时初始位置的直线距离,同时显示一条从初始位置到当前位置的红色直线。参考代码:运行效果:公众号“Python小屋”......
  • Python+matplotlib绘图时显示中文的设置方法
    在使用Python+matplotlib绘图时,默认不能显示中文字符,会显示为方块,例如下面的代码:上面代码绘制的图像如下,所有中文字符都显示为方块:如果要正常显示中文,可以使用matplotlib的rcParams设置font.family的值来统一设置中文字体,例如修改后代码生成的图像如下:通过rcParams还可以修改和设置......