在使用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]3、matplotlib支持很多种图形类型,主要可以分为: 1. 折线图: plt.plot()
#必须设置主体字体,不然中文显示不出来(也有其他方式设置) 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()
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