PyQt学习(二)-----图形的建立(柱状图,折线图,堆叠柱状图,饼图)

news2024/11/13 12:33:30

数据库列表如图所示,如何对其进行绘图:

(一)柱状图的建立

(1)柱状图初始化

self.__iniBarChart()

  @pyqtSlot()
    def __iniBarChart(self):
        chart =QChart()
        chart.setTitle("Barchart 演示")
        chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)
        self.ui.chartViewBar.setChart(chart)#为ChartView设置chart
        self.ui.chartViewBar.setRenderHint(QPainter.RenderHint.Antialiasing)#反走样

 注:线越精确,锯齿越小,反走样可以减少锯齿现象

 以上代码得到的页面如下:
 

 (2)设置坐标轴数据

setTongshuai = QBarSet("统帅")
setTongshuai = QBarSet("统帅")
setWuli = QBarSet("武力")
setZhili=QBarSet("智力")
setZhengzhi=QBarSet("政治")
setMeili = QBarSet("魅力")
        
seriesLine = QLineSeries()
seriesLine.setName("平均分")
stud_Count=self.dataModel.rowCount()#数据的行数
nameList=[]#设置姓名列表,用于QBarCategoryAxis类坐标轴
for i in range(stud_Count): #从数据模型中获取数据
            item=self.dataModel.item(i, 0)#第0列姓名
            nameList.append(item.text())#姓名,用作坐标轴标签
(i,1),(i,2)...表示每个姓名下的分类

            item=self.dataModel.item(i, 1)#第一列统帅
            setTongshuai.append(float(item.text()))
            
            item=self.dataModel.item(i, 2)#第二列武力
            setWuli.append(float(item.text()))
            
            item=self.dataModel.item(i, 3)#第三列智力
            setZhili.append(float(item.text()))
            
            item=self.dataModel.item(i, 4)#第四列政治
            setZhengzhi.append(float(item.text()))
            
            item=self.dataModel.item(i, 5)#第五列魅力
            setMeili.append(float(item.text()))
            
            
            item=self.dataModel.item(i, 6)
            if isVertical:
                seriesLine.append(i, float(item.text()))#平均分,用于柱状图
            else:
                seriesLine.append(float(item.text()), i)#平均分,用于水平柱状图
  
 #创建一个序列QBarSeries,并添加数据集
        if isVertical:
            seriesBar =QBarSeries()#柱状图
        else:
            seriesBar=QHorizontalBarSeries()#水平柱状图

 seriesBar.append(setTongshuai)#添加数据集
 seriesBar.append(setWuli)
 seriesBar.append(setZhili)
 seriesBar.append(setZhengzhi)
 seriesBar.append(setMeili)
 seriesBar.setLabelsVisible(True)#数据点标签可见
 seriesBar.setLabelsFormat("@value")#显示数值标签
 seriesBar.setLabelsPosition(QAbstractBarSeries.LabelsPosition.LabelsCenter)#数据标签显示位置
       
        chart.addSeries(seriesBar)#添加柱状图序列     
  ##姓名坐标轴
        axisStud=QBarCategoryAxis()
        axisStud.append(nameList)#添加横坐标文字列表
        axisStud.setRange(nameList[0], nameList[stud_Count-1])#坐标轴范围

(3)绘制数值型坐标轴

#数值型坐标轴
        axisValue=QValueAxis()
        axisValue.setRange(0, 100)
        axisValue.setTitleText("分数")
        axisValue.setTickCount(6) #刻度线数量
        axisValue.applyNiceNumbers() #让刻度线更好看
        
        if isVertical:
            chart.addAxis(axisStud, Qt.AlignmentFlag.AlignBottom)
            seriesBar.attachAxis(axisStud)
            chart.addAxis(axisValue, Qt.AlignmentFlag.AlignLeft)
            seriesBar.attachAxis(axisValue)
        else:
            chart.addAxis(axisStud, Qt.AlignmentFlag.AlignLeft)
            seriesBar.attachAxis(axisStud)
            chart.addAxis(axisValue, Qt.AlignmentFlag.AlignBottom)
            seriesBar.attachAxis(axisValue)

得到的柱状图结果 

得到的水平柱状图结果

 

注:其中的颜色是pyqt默认的主题:light

官网上不同主题显示不同效果,例如:bluecy主题

 折线图的展示只要在此基础上加入

 seriesLine = QLineSeries()#用于显示平均数
        seriesLine.setName("平均分")
        pen=QPen(Qt.GlobalColor.red)
        pen.setWidth(2)
        seriesLine.setPen(pen)
        seriesLine.setPointLabelsVisible(True)#数据点标签可见
        if isVertical:
            seriesLine.setPointLabelsFormat("@yPoint")#显示y数值标签
        else:
            seriesLine.setPointLabelsFormat("@xPoint")#显示x数值标签
        font=seriesLine.pointLabelsFont()
        font.setPointSize(10)
        font.setBold(True)
        seriesLine.setPointLabelsFont(font)

       chart.addSeries(seriesLine)#添加折线图序列

      seriesLine.attachAxis(axisStud)#添加轴

      seriesLine.attachAxis(axisValue)

(二)在进行堆叠柱状图的建立之前,要先清理轴和数据

chart.removeAllSeries() #删除所有序列
        for axis in chart.axes():
            chart.removeAxis(axis) #删除坐标轴

堆叠柱状图的代码和柱状图的代码是一样的,只是其不需要平均数这一列

 #数值型坐标轴
        axisValue=QValueAxis()
        axisValue.setRange(0, 500)
        axisValue.setTitleText("总分")
        axisValue.setTickCount(6) #刻度线数量
        axisValue.applyNiceNumbers() #让刻度线更好看

将坐标轴变一下,可以看到绘制的图为:

堆叠柱状图

水平堆叠柱状图

(三)百分比柱状图

初始化函数和之前是一样的操作,这里将主要的构造图函数

  if isVertical:
            chart.setTitle("PercentBar 演示")
  else:
            chart.setTitle("Horizontal PercentBar 演示")
            
        scoreBarSets=[] #QBarSet对象列表
        sectionCount=5 #5个分数段,分数段是数据集
        for i in range(sectionCount):
            item=self.ui.treeWidget.topLevelItem(i)
            barSet=QBarSet(item.text(0)) #一个分数段
            scoreBarSets.append(barSet) #QBarSet对象列表
            
        categories=["统帅", "武力", "智力", "政治", "魅力"]
        courseCount=5   #5门课程
        for i in range(sectionCount): #5个分数段
            item=self.ui.treeWidget.topLevelItem(i) #treeWidget第i行
            barSet=scoreBarSets[i]  #某个分数段的QBarSet
            for j in range(courseCount): #课程是category
                    barSet.append(float(item.text(j+1)))
                    
        if isVertical:
            seriesBar=QPercentBarSeries()#序列
        else:
            seriesBar=QHorizontalPercentBarSeries()#序列
        seriesBar.append(scoreBarSets)#添加一个QBarset对象列表
        seriesBar.setLabelsVisible(True)#显示百分比
            
        seriesBar.hovered.connect(self.do_barSeries_Hovered)#hovered信号
        seriesBar.clicked.connect(self.do_barSeries_Clicked)#clicked信号

        chart.addSeries(seriesBar)
            
        axisSection=  QBarCategoryAxis()#分类坐标
        axisSection.append(categories)
        axisSection.setTitleText("分数段")
        axisSection.setRange(categories[0], categories[courseCount-1])
            
        axisValue=  QValueAxis()#数值坐标
        axisValue.setRange(0, 100)
        axisValue.setTitleText("累积百分比")
        axisValue.setTickCount(6)
        axisValue.setLabelFormat("%.0f%")#标签格式
        axisValue.applyNiceNumbers()
            
        if isVertical:
            chart.addAxis(axisSection, Qt.AlignmentFlag.AlignBottom)
            seriesBar.attachAxis(axisSection)
            chart.addAxis(axisValue, Qt.AlignmentFlag.AlignLeft)
            seriesBar.attachAxis(axisValue)
        else:
            chart.addAxis(axisSection, Qt.AlignmentFlag.AlignLeft)
            seriesBar.attachAxis(axisSection)
            chart.addAxis(axisValue, Qt.AlignmentFlag.AlignBottom)
            seriesBar.attachAxis(axisValue)
        
        for marker in chart.legend().markers():#QLegendMarker类型列表
            marker.clicked.connect(self.do_LegendMarkerClicked)
            

 得到的图如下:

百分比柱状图:

水平百分比柱状图:

 (四)饼图

  @pyqtSlot()
    def draw_pieChart(self):
        chart=self.ui.chartViewPie.chart()#获取chart对象
        chart.legend().setAlignment(Qt.AlignmentFlag.AlignRight)
        chart.removeAllSeries()
        
        colNo=1+self.ui.comboCourse.currentIndex()
        
        seriesPie = QPieSeries()
        seriesPie.setHoleSize(self.ui.spinHoleSize.value())
        sec_count=5
        seriesPie.setLabelsVisible(True)
        
        for i in range(sec_count):
            item=self.ui.treeWidget.topLevelItem(i)
            sliceLabel=item.text(0)+"(%s人)"%item.text(colNo)
            sliceValue=int(item.text(colNo))
            seriesPie.append(sliceLabel, sliceValue)
            
        seriesPie.setLabelsVisible(True)#只影响当前的slices,必须添加玩slice之后再设置
        seriesPie.hovered.connect(self.do_pieHovered)#鼠标落在某个分块上时,次分块弹出
        chart.addSeries(seriesPie)
        chart.setTitle("Piechart---"+self.ui.comboCourse.currentText())
    
    @pyqtSlot(int)
    def on_comboCourse_currentIndexChanged(self, index):
        self.draw_pieChart()

hover效果的呈现: 

def do_pieHovered(self, pieSlice, state):
        pieSlice.setExploded(state)#弹回或缩回,具有动态效果
        if state:#显示带百分数的标签
            self.__oldLabel=pieSlice.label()#保存原来的label
            pieSlice.setLabel(self.__oldLabel+":%.1f%%"
                            %(pieSlice.percentage()*100))
        else:#显示原来的标签
            pieSlice.setLabel(self.__oldLabel)

选中的图会呈现悬浮效果: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/675812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

md5的特点以及加密原理

MD5的特点及加密原理 简介特点1.长度固定2.结果不可逆3.高度离散性4.抗碰撞性 适用场景1.用户密码保护2.文件传输完整性校验3.数字签名4.云盘秒传 加密原理一.1.对输入的内容进行补位使其长度变成 N * 512 448 (即长度对512取余之后 余数为448)2.再往后补…

【数据可视化】大作业(意向考研高校的数据可视化)

文章目录 前言一、数据介绍1.1 基本信息1.2 考研信息1.3 导师信息 二、预处理及分析2.1 数据预处理2.1.1 考研信息预处理2.1.2 导师信息预处理 2.2 数据分析 三、可视化方法及结果3.1 可视化方法3.2 可视化结果展示3.2.1 基本信息3.2.2 考研信息3.2.3 导师信息 四、总结五、附录…

pip install安装CPM-Bee出现ModuleNotFoundError: No module named ‘torch‘的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

WPF开发txt阅读器18:用json格式存储配置文件

文章目录 json参数保存 txt阅读器系列: 需求分析和文件读写目录提取类💎列表控件与目录💎快捷键翻页字体控件绑定💎前景/背景颜色书籍管理系统💎用树形图管理书籍语音播放💎播放进度显示💎快进…

网工大题题型总结(2)---设备类型及设备故障问题

(一)设备选择 2018年上半年 试题一 根据表 1-1 及图 1-1 可知,在图 1-1 中为了保护内部网络,实现包过滤功能,位置A 应部署(6)设备,其工作在(7)模式. (6)防火墙 (7&a…

AIGC教育(续篇):探索掌握AIGC,引领未来的人才之路

(本文阅读时间:5 分钟) 1 未来人才的核心竞争力: 蓬勃绽放的潜力 展望未来,我们不禁思考:当自动化工具日益普及,且代替人力的成本并不高昂时,每个人的工具属性在未来工作中所占比重必…

Git提交规范

目录 1、commit message format消息格式 2、还原 3、提交类型 4、Subject 5、Body 6、Footer 7、git-commit-plugin 插件 以下规范参考Angular提交的规范。 对于如何格式化git commit消息,我们有非常精确的规则。 这导致更多 在浏览项目历史时,易…

【Visual Studio】报错 C2653,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个 Bug 是我做这个工程时遇到的:【Visual Studio】Qt 的实时绘图曲线功能,使用 C 语言,配合 Qt 开发串口通信界面。 文…

【面试】标准库相关题型(一)

文章目录 1. vector底层实现原理1.1 类构成1.2 构造函数1.3 插入元素1.4 删除元素1.5 读取元素1.6 修改元素1.7 释放空间 2. vector内存增长机制2.1 特点2.2 内存增长特性2.3 内存增长过程2.4 内存清理2.5 注意事项 3. vector中reserve和resize的区别3.1 共同点3.2 区别3.3 应用…

LangChain入门介绍

原文首发于博客文章LangChain介绍 我们先看看官方的定义 LangChain是一个基于语言模型开发应用程序的框架。它可以实现以下应用程序: 数据感知:将语言模型连接到其他数据源自主性:允许语言模型与其环境进行交互 LangChain的主要价值在于&…

现在可以使用开发者工具为苹果Vision Pro创建空间体验

库比蒂诺,加利福尼亚—苹果公司今天宣布,全新的软件工具及技术现已可供开发者使用,它们能够用于为苹果首款空间计算机—Apple Vision Pro,创造出独特且前所未有的应用体验。Vision Pro具备visionOS,这是全球首款空间操…

【ABAP】数据类型(三)「数据字典数据类型」

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…

Unity简单的移动相机

Unity3D制作一个会移动的方块(还不会移动照相机)_SMG_DSG的博客-CSDN博客 接着上一次的文章代码,我们继续写,其实简单的移动也是非常简单,我们只需要使用一个相机一直面对着方块的函数就行了 好了,废话不…

Tkinter之窗口布局介绍

Tkinter之窗口布局介绍 关于Python 的Tkinter窗口基础可参见https://blog.csdn.net/cnds123/article/details/127227651 Tkinter 之几何管理器(geometry manager),也叫布局(layout),是用来控制窗体中小部…

STM32单片机(八)DMA直接存储器存取----第二节:DMA直接存储器存取练习(DMA数据转运和DMA+AD多通道)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

PyTorch深度学习实战(4)——常用激活函数和损失函数详解

PyTorch深度学习实战(4)——常用激活函数和损失函数详解 0. 前言1. 常用激活函数1.1 Sigmoid 激活函数1.2 Tanh 激活函数1.3 ReLU 激活函数1.4 线性激活函数1.5 Softmax 激活函数 2. 常用损失函数2.1 均方误差2.2 平均绝对误差2.3 分类交叉熵 2.4 实现自…

分享一组开关按钮

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>豆子开关</title><style>* {margin: 0;padding: 0;box-sizing: border-box;-webkit-tap-hi…

STM32单片机(八)DMA直接存储器存取----第一节:DMA直接存储器存取

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

使用Python制作简单的图表并设置图表元素

案例01 在python中制作简单的图表 import matplotlib.pyplot as plt # 导入matplotlib模块 x [1, 2, 3, 4, 5, 6] # 给出x坐标的数据 y [2, 4, 6, 8, 10, 12] # 给出y坐标的数据 plt.plot(x, y, color red, linewidth 3, linestyle solid) # 绘制折线图 plt.show() # …

动态库的入口——VCRT(DLL)和CRT(SO)

摘要&#xff1a;为了更加深入的理解动态库的加载初始化过程&#xff0c;本文根据VCRT和Linux-CRT的代码实现详细描述了windows和linux平台下对应动态库加载时会进行哪些工作。本文重点关注全局变量的初始化时机&#xff0c;以及是否有其他额外的操作。   关键字&#xff1a;…