200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > PyQt学习(二)-----图形的建立(柱状图 折线图 堆叠柱状图 饼图)

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

时间:2019-07-18 21:01:45

相关推荐

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

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

(一)柱状图的建立

(1)柱状图初始化

self.__iniBarChart()

@pyqtSlot()def __iniBarChart(self):chart =QChart()chart.setTitle("Barchart 演示")chart.setAnimationOptions(QChart.AnimationOption.SeriesAnimations)self.ui.chartViewBar.setChart(chart)#为ChartView设置chartself.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] #某个分数段的QBarSetfor j in range(courseCount): #课程是categorybarSet.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+boCourse.currentIndex()seriesPie = QPieSeries()seriesPie.setHoleSize(self.ui.spinHoleSize.value())sec_count=5seriesPie.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---"+boCourse.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()#保存原来的labelpieSlice.setLabel(self.__oldLabel+":%.1f%%"%(pieSlice.percentage()*100))else:#显示原来的标签pieSlice.setLabel(self.__oldLabel)

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。