当前位置:   article > 正文

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

pyqt柱状图

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

(一)柱状图的建立

(1)柱状图初始化

self.__iniBarChart()

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

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

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

 (2)设置坐标轴数据

  1. setTongshuai = QBarSet("统帅")
  2. setTongshuai = QBarSet("统帅")
  3. setWuli = QBarSet("武力")
  4. setZhili=QBarSet("智力")
  5. setZhengzhi=QBarSet("政治")
  6. setMeili = QBarSet("魅力")
  7. seriesLine = QLineSeries()
  8. seriesLine.setName("平均分")
  9. stud_Count=self.dataModel.rowCount()#数据的行数
  10. nameList=[]#设置姓名列表,用于QBarCategoryAxis类坐标轴
  11. for i in range(stud_Count): #从数据模型中获取数据
  12. item=self.dataModel.item(i, 0)#第0列姓名
  13. nameList.append(item.text())#姓名,用作坐标轴标签
  14. (i,1),(i,2)...表示每个姓名下的分类
  15. item=self.dataModel.item(i, 1)#第一列统帅
  16. setTongshuai.append(float(item.text()))
  17. item=self.dataModel.item(i, 2)#第二列武力
  18. setWuli.append(float(item.text()))
  19. item=self.dataModel.item(i, 3)#第三列智力
  20. setZhili.append(float(item.text()))
  21. item=self.dataModel.item(i, 4)#第四列政治
  22. setZhengzhi.append(float(item.text()))
  23. item=self.dataModel.item(i, 5)#第五列魅力
  24. setMeili.append(float(item.text()))
  25. item=self.dataModel.item(i, 6)
  26. if isVertical:
  27. seriesLine.append(i, float(item.text()))#平均分,用于柱状图
  28. else:
  29. seriesLine.append(float(item.text()), i)#平均分,用于水平柱状图
  30. #创建一个序列QBarSeries,并添加数据集
  31. if isVertical:
  32. seriesBar =QBarSeries()#柱状图
  33. else:
  34. seriesBar=QHorizontalBarSeries()#水平柱状图
  35. seriesBar.append(setTongshuai)#添加数据集
  36. seriesBar.append(setWuli)
  37. seriesBar.append(setZhili)
  38. seriesBar.append(setZhengzhi)
  39. seriesBar.append(setMeili)
  40. seriesBar.setLabelsVisible(True)#数据点标签可见
  41. seriesBar.setLabelsFormat("@value")#显示数值标签
  42. seriesBar.setLabelsPosition(QAbstractBarSeries.LabelsPosition.LabelsCenter)#数据标签显示位置
  43. chart.addSeries(seriesBar)#添加柱状图序列
  44. ##姓名坐标轴
  45. axisStud=QBarCategoryAxis()
  46. axisStud.append(nameList)#添加横坐标文字列表
  47. axisStud.setRange(nameList[0], nameList[stud_Count-1])#坐标轴范围

(3)绘制数值型坐标轴

  1. #数值型坐标轴
  2. axisValue=QValueAxis()
  3. axisValue.setRange(0, 100)
  4. axisValue.setTitleText("分数")
  5. axisValue.setTickCount(6) #刻度线数量
  6. axisValue.applyNiceNumbers() #让刻度线更好看
  7. if isVertical:
  8. chart.addAxis(axisStud, Qt.AlignmentFlag.AlignBottom)
  9. seriesBar.attachAxis(axisStud)
  10. chart.addAxis(axisValue, Qt.AlignmentFlag.AlignLeft)
  11. seriesBar.attachAxis(axisValue)
  12. else:
  13. chart.addAxis(axisStud, Qt.AlignmentFlag.AlignLeft)
  14. seriesBar.attachAxis(axisStud)
  15. chart.addAxis(axisValue, Qt.AlignmentFlag.AlignBottom)
  16. seriesBar.attachAxis(axisValue)

得到的柱状图结果 

得到的水平柱状图结果

 

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

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

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

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

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

      seriesLine.attachAxis(axisStud)#添加轴

      seriesLine.attachAxis(axisValue)

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

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

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

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

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

堆叠柱状图

水平堆叠柱状图

(三)百分比柱状图

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

  1. if isVertical:
  2. chart.setTitle("PercentBar 演示")
  3. else:
  4. chart.setTitle("Horizontal PercentBar 演示")
  5. scoreBarSets=[] #QBarSet对象列表
  6. sectionCount=5 #5个分数段,分数段是数据集
  7. for i in range(sectionCount):
  8. item=self.ui.treeWidget.topLevelItem(i)
  9. barSet=QBarSet(item.text(0)) #一个分数段
  10. scoreBarSets.append(barSet) #QBarSet对象列表
  11. categories=["统帅", "武力", "智力", "政治", "魅力"]
  12. courseCount=5 #5门课程
  13. for i in range(sectionCount): #5个分数段
  14. item=self.ui.treeWidget.topLevelItem(i) #treeWidget第i行
  15. barSet=scoreBarSets[i] #某个分数段的QBarSet
  16. for j in range(courseCount): #课程是category
  17. barSet.append(float(item.text(j+1)))
  18. if isVertical:
  19. seriesBar=QPercentBarSeries()#序列
  20. else:
  21. seriesBar=QHorizontalPercentBarSeries()#序列
  22. seriesBar.append(scoreBarSets)#添加一个QBarset对象列表
  23. seriesBar.setLabelsVisible(True)#显示百分比
  24. seriesBar.hovered.connect(self.do_barSeries_Hovered)#hovered信号
  25. seriesBar.clicked.connect(self.do_barSeries_Clicked)#clicked信号
  26. chart.addSeries(seriesBar)
  27. axisSection= QBarCategoryAxis()#分类坐标
  28. axisSection.append(categories)
  29. axisSection.setTitleText("分数段")
  30. axisSection.setRange(categories[0], categories[courseCount-1])
  31. axisValue= QValueAxis()#数值坐标
  32. axisValue.setRange(0, 100)
  33. axisValue.setTitleText("累积百分比")
  34. axisValue.setTickCount(6)
  35. axisValue.setLabelFormat("%.0f%")#标签格式
  36. axisValue.applyNiceNumbers()
  37. if isVertical:
  38. chart.addAxis(axisSection, Qt.AlignmentFlag.AlignBottom)
  39. seriesBar.attachAxis(axisSection)
  40. chart.addAxis(axisValue, Qt.AlignmentFlag.AlignLeft)
  41. seriesBar.attachAxis(axisValue)
  42. else:
  43. chart.addAxis(axisSection, Qt.AlignmentFlag.AlignLeft)
  44. seriesBar.attachAxis(axisSection)
  45. chart.addAxis(axisValue, Qt.AlignmentFlag.AlignBottom)
  46. seriesBar.attachAxis(axisValue)
  47. for marker in chart.legend().markers():#QLegendMarker类型列表
  48. marker.clicked.connect(self.do_LegendMarkerClicked)

 得到的图如下:

百分比柱状图:

水平百分比柱状图:

 (四)饼图

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

hover效果的呈现: 

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/132454
推荐阅读
相关标签
  

闽ICP备14008679号