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

在使用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)#添加一个1行1列的子图,此处的111可以理解为1行1列的第1个子图。 else: # 如果不为空,删除原有的Axes后添加 self.figure.delaxes(ax[0]) ax = self.figure.add_subplot(111)#添加一个1行1列的子图,此处的111可以理解为1行1列的第1个子图。
        #绘制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) #添加一个1行1列的子图,此处的111可以理解为1行1列中的第1个子图 else: # 如果不为空,删除原有的Axes后添加 self.figure2.delaxes(ax[0]) ax = self.figure2.add_subplot(111)#添加一个1行1列的子图,此处的111可以理解为1行1列的第1个子图。
            #此函数用于处理基础数据值,用于显示到饼图
            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 
 
 

 

posted @ 2023-06-20 11:02  No九五二七9527  阅读(573)  评论(0)    收藏  举报