前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PyQt5可视化 7 饼图和柱状图实操案例 ③柱状图的实现【超详解】

PyQt5可视化 7 饼图和柱状图实操案例 ③柱状图的实现【超详解】

作者头像
会洗碗的CV工程师
发布2023-03-13 09:57:58
2.2K0
发布2023-03-13 09:57:58
举报
文章被收录于专栏:LongJava学习资料

目录

一、柱状图

1 import新模块

2 初始化柱状图和绘制柱状图函数 

3 反走样

4 构造函数里添加调用 

5 运行效果

1.5.1 全局图

1.5.2 柱状图

二、一步一步画柱状图(draw_barChart函数)

1 最简单的draw_barChart

2 添加标签坐标轴

3 添加数据坐标轴

4 添加平均分作为折线序列

5 添加数据点标签

6 添加标题和图例

7 hovered信号和槽函数

2.7.1 槽函数 

2.7.2 关联 

2.7.3 运行效果 

8 clicked信号和槽函数

2.8.1 槽函数

2.8.2 关联 

2.8.3 运行效果

9 图例单击信号和槽函数

2.9.1 槽函数

2.9.2 关联

2.9.3 运行效果

10 补充其他数据字段

11 最终运行结果 

12 如果提示找不到QtChart

三、完整函数代码


一、柱状图

1 import新模块

2 初始化柱状图和绘制柱状图函数

绘制柱状图和绘制水平柱状图用同一个函数实现,都是draw_barChart(),只是其中的参数不同

3 反走样

红色框框中的语句是要打开QPainter的反走样功能。 在计算机中绘制一条直线,会有明显的锯齿现象,这就叫走样。

比如要绘制A到B的直线,计算机上只能显示那些红色的点。网格越密,分辨率越高,直线越精确,锯齿越小。 

4 构造函数里添加调用

5 运行效果

1.5.1 全局图

1.5.2 柱状图

先看看数据

再看看最终画出来的柱状图 

二、一步一步画柱状图(draw_barChart函数)

1 最简单的draw_barChart

运行效果如图 

2 添加标签坐标轴

在函数中添加如下红色框中代码 (1)生成坐标轴数据

(2)设置坐标轴和画坐标轴

运行效果 

3 添加数据坐标轴

插入代码

运行效果 

4 添加平均分作为折线序列

添加代码

(1)折线序列设置

(2)添加数据和添加序列 

(3)添加轴

运行效果

5 添加数据点标签

补充代码

运行效果

6 添加标题和图例

补充代码

运行效果 

7 hovered信号和槽函数

hovered信号:在鼠标光标进入或离开一个棒柱时发射

2.7.1 槽函数

在statusbar上显示信息 

2.7.2 关联

2.7.3 运行效果

8 clicked信号和槽函数

hovered是鼠标光标进入或离开柱子,clicked是要点击柱子

2.8.1 槽函数

2.8.2 关联

2.8.3 运行效果

没点击前,鼠标放在柱子上,hovered

点击后,clicked 

9 图例单击信号和槽函数

2.9.1 槽函数

2.9.2 关联

2.9.3 运行效果

点图例文字或方块

柱子隐藏了,图例也变了 

再点统帅,变回原样 

点平均分 

10 补充其他数据字段

所有功能都实现了,补充其他字段的代码。

(1)定义

(2)数据生成

(3)添加数据集

11 最终运行结果

12 如果提示找不到QtChart

是因为之前系统安装的时候漏装了QtChart,用pip命令安装PyQtChart

三、完整函数代码

代码语言:javascript
复制
def __iniBarChart(self):        ##初始化柱状图
        chart = QChart()
        chart.setTitle("Barchart 演示")
        self.ui.chartViewBar.setChart(chart)    #为chartView设置chart
        self.ui.chartViewBar.setRenderHint(QPainter.Antialiasing)
        self.ui.chartViewBar.setCursor(Qt.CrossCursor)      #设置鼠标指针为十字星
        
    def draw_barChart(self,  isVertical=True):      ##绘制柱状图,或水平柱状图
        chart =self.ui.chartViewBar.chart()
        chart.removeAllSeries()     #删除所有序列
        chart.removeAxis(chart.axisX())     #删除坐标轴
        chart.removeAxis(chart.axisY())     #删除坐标轴
        
        if isVertical:
            chart.setTitle("BarChart 演示")
            chart.legend().setAlignment(Qt.AlignBottom)
        else:
            chart.setTitle("Horizonal BarChart 演示")
            chart.legend().setAlignment(Qt.AlignRight)
        
        setTongshuai=QBarSet("统帅")
        setWuli = QBarSet("武力")
        setZhili = QBarSet("智力")
        setZhengzhi = QBarSet("政治")
        setMeili = QBarSet("魅力")
        
        seriesLine = QLineSeries()      #QLineSeries序列用于显示平均分
        seriesLine.setName("平均分")
        pen=QPen(Qt.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)
        
        stud_Count=self.dataModel.rowCount()
        nameList=[]     #学生姓名列表,用于QBarCategoryAxis类坐标轴
        for i in range(stud_Count):     #从数据模型获取数据生成数据集
            item=self.dataModel.item(i, 0)      #第0列姓名
            nameList.append(item.text())        #姓名,用作坐标轴标签
            
            item=self.dataModel.item(i, 1)       #第1列统帅
            setTongshuai.append(float(item.text()))
            
            item=self.dataModel.item(i, 2)       #第2列武力
            setWuli.append(float(item.text()))
            
            item=self.dataModel.item(i, 3)       #第3列智力
            setZhili.append(float(item.text()))
            
            item=self.dataModel.item(i, 4)       #第4列政治
            setZhengzhi.append(float(item.text()))
            
            item=self.dataModel.item(i, 5)       #第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.LabelsCenter)     #数据标签显示位置
        
        seriesBar.hovered.connect(self.do_barSeries_Hovered)        #hovered信号
        seriesBar.clicked.connect(self.do_barSeries_Clicked)        #clicked信号
       
        chart.addSeries(seriesBar)      #添加柱状图序列
        chart.addSeries(seriesLine)     #添加折线图序列
        
        ##学生姓名坐标轴
        axisStud = QBarCategoryAxis()
        axisStud.append(nameList)       #添加横坐标文字列表
        axisStud.setRange(nameList[0], nameList[stud_Count-1])      #坐标轴范围
        
        #数值型坐标轴
        axisValue = QValueAxis()
        axisValue.setRange(0, 100)
        axisValue.setTitleText("分数")
        axisValue.setTickCount(6)         #刻度线数量
        axisValue.applyNiceNumbers()        #让刻度线更好看
        
        if isVertical:
            chart.setAxisX(axisStud, seriesBar)
            chart.setAxisY(axisValue, seriesBar)
            chart.setAxisX(axisStud, seriesLine)
            chart.setAxisY(axisValue, seriesLine)
        else:
            chart.setAxisX(axisValue, seriesBar)
            chart.setAxisY(axisStud, seriesBar)
            chart.setAxisY(axisStud, seriesLine)
            chart.setAxisX(axisValue, seriesLine)
            
        for maker in chart.legend().markers():      #QLegendMarker类型列表
            maker.clicked.connect(self.do_LegendMarkerClicked)
            
    def do_barSeries_Hovered(self, status, index, barset):      ##关联hovered信号
        hint="hovered barSet="+barset.label()
        if status:
            hint=hint+", index=%d, value=%.2f"%(index, barset.at(index))
        else:
            hint=""
        self.ui.statusbar.showMessage(hint)
        
    def do_barSeries_Clicked(self,  index,  barset):##关联clicked信号
        hint="clicked barset="+barset.label()
        hint=hint+", count=%d, sum=%.2f"%(barset.count(),  barset.sum())
        self.ui.statusbar.showMessage(hint)
        
    def do_LegendMarkerClicked(self):       ##点击图例小方块
        marker =self.sender()       #QLegendMarker marker∶信号的发射者
        marker.series().setVisible(not marker.series().isVisible())
        marker.setVisible(True)
        alpha = 1.0 
        if not marker.series().isVisible():
            alpha = 0.5

        brush = marker.labelBrush()     #QBrush 
        color = brush.color()       #QColor
        color.setAlphaF(alpha)
        brush.setColor(color)
        marker.setLabelBrush(brush)
        
        brush = marker.brush()
        color = brush.color()
        color.setAlphaF(alpha)
        brush.setColor(color)
        marker.setBrush(brush)
        
        pen = marker.pen()      #QPen
        color = pen.color()
        color.setAlphaF(alpha)
        pen.setColor(color)
        marker.setPen(pen)
    
    @pyqtSlot()     # #绘制柱状图
    def on_btnBuildBarChart_clicked(self):
        self.draw_barChart()

    @pyqtSlot()      ##绘制水平柱状图
    def on_btnBuildBarChartH_clicked(self):
        self.draw_barChart(False)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、柱状图
    • 1 import新模块
      • 2 初始化柱状图和绘制柱状图函数
        • 3 反走样
          • 4 构造函数里添加调用
            • 5 运行效果
              • 1.5.1 全局图
              • 1.5.2 柱状图
          • 二、一步一步画柱状图(draw_barChart函数)
            • 1 最简单的draw_barChart
              • 2 添加标签坐标轴
                • 3 添加数据坐标轴
                  • 4 添加平均分作为折线序列
                    • 5 添加数据点标签
                      • 6 添加标题和图例
                        • 7 hovered信号和槽函数
                          • 2.7.1 槽函数
                          • 2.7.2 关联
                          • 2.7.3 运行效果
                        • 8 clicked信号和槽函数
                          • 2.8.1 槽函数
                          • 2.8.2 关联
                          • 2.8.3 运行效果
                        • 9 图例单击信号和槽函数
                          • 2.9.1 槽函数
                          • 2.9.2 关联
                          • 2.9.3 运行效果
                        • 10 补充其他数据字段
                          • 11 最终运行结果
                            • 12 如果提示找不到QtChart
                            • 三、完整函数代码
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档