【PySide6】QChart筆記(二)—— QBarSeries的使用

来源:https://www.cnblogs.com/LinfengBingyi/archive/2023/11/10/17816325.html
-Advertisement-
Play Games

一、QBarSeries簡介 1. 官方描述 https://doc.qt.io/qtforpython-6/PySide6/QtCharts/QBarSeries.html 【譯註:官方文檔內容過於簡潔,表明完全僅繼承了QAbstractBarSeries,且沒有擴展任何屬性、方法和信號。因此,直 ...


一、QBarSeries簡介

1. 官方描述

https://doc.qt.io/qtforpython-6/PySide6/QtCharts/QBarSeries.html
【譯註:官方文檔內容過於簡潔,表明完全僅繼承了QAbstractBarSeries,且沒有擴展任何屬性、方法和信號。因此,直接參考QAbstractBarSeries的文檔:】
https://doc.qt.io/qtforpython-6/PySide6/QtCharts/QAbstractBarSeries.html

在條形圖中,條形被定義為每個類別(category,x軸劃分的一個區間)包含一個數據值的條形集合(bar set)。條形的位置由類別指定,其高度由數據值指定。包含多個條形集合的條形序列(bar series)將屬於同一類別的條形組合在一起。條形圖的樣式由所選的 QAbstractBarSeries 子類 ( QBarSeries, QStackedBarSeries, QPercentBarSeries, QHorizontalStackedBarSeries, QHorizontalPercentBarSeries, QHorizontalBarSeries ) 來決定。

1.1 屬性

屬性 描述
barWidth 序列中條形的寬度
count 序列中條形集合的數量
labelsAngle 數值標簽的角度(單位為度)。數值標簽是標註在條形上,表示該條形的值的標簽
labelsFormat 數值標簽的顯示格式。通過 setLabelsFormat(str) 方法實現,入參字元串中通過'@value'表示引用數值。一個例子:setLabelsFormat('@value km')
labelsPosition 數值標簽的位置
labelsPrecision 數值標簽中顯示的最大有效位數
labelsVisible 數值標簽的可見性。預設為False

1.2 信號

信號 描述
hovered(status, index, barset) 滑鼠懸停到條形,或離開條形時觸發,發送三個數據。滑鼠懸停到條形時,status為True,離開時為False;index的值為條形在條形組(bar set)中的編號;barset的值為對應的QBarSet對象。可以通過 QBarSet.label() 獲取該條形組的名稱,還可以通過 QBarSet.at(index) 獲取該條形的數值

2. 官方用例

https://doc.qt.io/qtforpython-6/examples/example_charts_barchart.html
該用例繪製了每組包含5種數據的條形圖。

image

2.1 創建條形圖

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause

"""PySide6 port of the linechart example from Qt v6.x"""

import sys

from PySide6.QtCharts import (QBarCategoryAxis, QBarSeries, QBarSet, QChart,
                              QChartView, QValueAxis)
from PySide6.QtCore import Qt
from PySide6.QtGui import QPainter
from PySide6.QtWidgets import QApplication, QMainWindow


class TestChart(QMainWindow):
    def __init__(self):
        super().__init__()

        # 創建QBarSet。每組條形有5種數據,因此需要創建5個
        self.set_0 = QBarSet("Jane")
        self.set_1 = QBarSet("John")
        self.set_2 = QBarSet("Axel")
        self.set_3 = QBarSet("Mary")
        self.set_4 = QBarSet("Samantha")

        # 向各QBarSet添加數據
        self.set_0.append([1, 2, 3, 4, 5, 6])
        self.set_1.append([5, 0, 0, 4, 0, 7])
        self.set_2.append([3, 5, 8, 13, 8, 5])
        self.set_3.append([5, 6, 7, 3, 4, 5])
        self.set_4.append([9, 7, 5, 3, 1, 2])

        # 創建QBarSeries,並將QBarSet加入其中
        self.series = QBarSeries()
        self.series.append(self.set_0)
        self.series.append(self.set_1)
        self.series.append(self.set_2)
        self.series.append(self.set_3)
        self.series.append(self.set_4)

        # 創建QCahrt,並與QBarSeries綁定
        self.chart = QChart()
        self.chart.addSeries(self.series)
        self.chart.setTitle("Simple barchart example")
        self.chart.setAnimationOptions(QChart.SeriesAnimations)

        # 不同於QXYSeries,條形圖的x軸標簽直接與QBarCategoryAxis綁定
        self.categories = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
        self.axis_x = QBarCategoryAxis()
        self.axis_x.append(self.categories)
        # 將x軸先後與QChart、QBarSeries綁定
        self.chart.addAxis(self.axis_x, Qt.AlignBottom)
        self.series.attachAxis(self.axis_x)

        self.axis_y = QValueAxis()
        self.axis_y.setRange(0, 15)
        # 將y軸先後與QChart、QBarSeries綁定
        self.chart.addAxis(self.axis_y, Qt.AlignLeft)
        self.series.attachAxis(self.axis_y)

        self.chart.legend().setVisible(True)
        self.chart.legend().setAlignment(Qt.AlignBottom)

        self._chart_view = QChartView(self.chart)
        self._chart_view.setRenderHint(QPainter.Antialiasing)

        self.setCentralWidget(self._chart_view)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = TestChart()
    window.show()
    window.resize(420, 300)
    sys.exit(app.exec())

二、實踐

1. 用例說明

用每日收支數據繪製條形圖。

image

2. 代碼實現

from PySide6.QtCharts import QChart, QChartView, QBarSet, QBarSeries, QBarCategoryAxis
from PySide6.QtGui import QPainter
from PySide6.QtCore import Qt, QDateTime
from PySide6.QtWidgets import QApplication, QMainWindow

app = QApplication([])
window = QMainWindow()
chart = QChart()
chart.setTitle('收支統計')

# 準備數據
axisX_date = [QDateTime.currentDateTime().addDays(i) for i in range(5)]
axisY_value1 = [10 - 2 * i for i in range(5)]
axisY_value2 = [5 + i * (-1) ** i for i in range(5)]

# 創建條形圖集合set【每個set都是條形圖中一種待展示的數據類別】
bar_set_expense = QBarSet('支出')
bar_set_income = QBarSet('收入')
# 將值傳入條形圖集合set【通過列表的形式,存入某種數據類別的一組數值】
for i in range(5):
    bar_set_expense.append(axisY_value1[i])
    bar_set_income.append(axisY_value2[i])

# 創建條形圖序列series【series只與QChart有關,而與待展示數據的種類無關,因此只需創建一個】
bar_series = QBarSeries()
# 將數據集合存入series
bar_series.append(bar_set_expense)
bar_series.append(bar_set_income)

# 將series加入chart
chart.addSeries(bar_series)

# 嘗試另一種坐標創建方法:先創建預設坐標系,再創建自定義坐標軸,最後僅替換對應的坐標軸
chart.createDefaultAxes()

# 創建條形圖坐標軸
axis_x = QBarCategoryAxis()
# 必須是字元串列表,以便得到預期格式
axis_x.append([date.toString("yyyy/MM/dd") for date in axisX_date])
# 替換原x軸
chart.removeAxis(chart.axes(Qt.Orientation.Horizontal)[0])
chart.addAxis(axis_x, Qt.AlignBottom)
bar_series.attachAxis(axis_x)

# 【註意】也許你會在網上看到如下方法的使用。具體情況參考“三、問題與總結”
# 未來將不支持的方法:chart.removeAxis(chart.axisX())
# 未來將不支持的方法:chart.setAxisX(axis_x, bar_series)

# 顯示圖表
chartView = QChartView(chart)
chartView.setRenderHint(QPainter.Antialiasing)
window.setCentralWidget(chartView)
window.show()
app.exec()

三、問題與總結

1. DeprecationWarning: Function: 'QChart.axisX(QAbstractSeries * series) const' is marked as deprecated, please check the documentation for more information

問題描述

當調用QChart.axisX()Qchart.setAxisX()等方法時,得到該警告。原因是這些方法被標記為“不支持的方法”,應當通過其他方法實現。

解決方法

對於QChart.axisX()

替換為:

# defination
def Qchart.axes(self, orientation: Orientation,
                series: QAbstractSeries | None) -> list[QAbstractAxis]

# example: 獲取第一個水平坐標軸
axis_x = chart.axes(Qt.Orientation.Horizontal)[0]

對於QChart.setAxisX()

沒有對應的方法可以替代,但可以更改為以下幾個步驟:

# defination
chart.removeAxis(chart.axes(Qt.Orientation.Horizontal)[0])
chart.addAxis(axis_x, Qt.AlignBottom)
series.attachAxis(axis_x)

2. 更新條形圖的正確代碼順序

問題描述

當需要展示多種意義的數據時,不同於QXYSeries及其派生類序列,條形圖QChart只需與一個QBarSeries綁定。在這個唯一的QBarSeries中,多種意義的數據通過多個QBarSet表示。

當更新條形圖時,只需更新QBarSeries內的各個QBarSet(與其說是更新,更像是丟棄重造)。因此,實現該過程的代碼會與QXYSeries類的圖表有所差異(主要在於數據傳入的部分)。

解決方法

  • 清除 QBarSeries 對象中的舊數據,即調用QBarSeries.clear()
  • 對於每種數據,創建 QBarSet 對象,並將數據寫入 QBarSet 對象, 即調用QBarSet.append()
  • 將每個 QBarSet 對象加入 QBarSeries 對象, 即調用QBarSeries.append()
  • 【僅需一次】將 QBarSeries 對象與 QChart 對象綁定,即調用QChart.addSeries()
  • 刪除舊坐標軸 QAbstractAxis 對象,並重新創建。其中,x軸為 QBarCategoryAxis 對象
  • 將新 QAbstractAxis 對象與 QChart 對象綁定,即調用QChart.addAxis()
  • 將新 QAbstractAxis 對象與 QBarSeries 對象綁定,即調用QBarSeries.attachAxis()

本文來自博客園,作者:林風冰翼,轉載請註明原文鏈接:https://www.cnblogs.com/LinfengBingyi/p/17816325.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用不可信的數據,通過調用不安全的遞歸函數來暴露預設原型 原型污染:基礎 什麼是原型污染? 原型污染是一種針對JavaScript運行時的註入攻擊。通過原型污染,攻擊者可以控制對象屬性的預設值,從而篡改應用程式的邏輯並可能導致服務被拒絕,甚至在某些極端情況下遠程執行代碼。 現在,你是不是滿腦子充滿了 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 記錄一下在公司遇到的一些功能,以及相關實現 以上的內容我花了一周時間去實現的,自己也覺得時間很長,但主要因為很少使用ECharts,導致使用的過程中大部分的時間都在查文檔。 對於上面的這些功能點,其實算是寫了兩遍吧,這周一開了個Code ...
  • 1、業務背景 使用vue+element開發報表功能時,需要列表上某列的超鏈接按鈕彈窗展示,在彈窗的el-table列表某列中再次使用超鏈接按鈕點開彈窗,以此類推多表格彈窗嵌套,本文以彈窗兩次為例 最終效果如下示例頁面 2、具體實現和問題拋出 <template> <div class="el_ma ...
  • 作者:WangMin 格言:努力做好自己喜歡的每一件事 對於初學CSS的同學來說,會有很多屬性相關的疑問,行高屬性 line-height一定是其中一個,因為它是CSS中非常重要的一個屬性,這個屬性改變元素在網頁中的行高,讓你的網頁看起來更加整潔,美觀。 什麼是行高? CSS中的行高(line-he ...
  • 我們可以採取多種方法對數據架構進行分類,且每種方法都有自己的優缺點。它們可以幫助你做出明智的決定,選擇適合與你需求最匹配的設計。兩種最流行的基於速度的架構是Lambda和Kappa,本文將介紹基於速度的數據架構,以及它們在總體方案中的位置。 ...
  • 從接觸領域驅動設計的初學階段,到實現一個舊系統改造到DDD模型,再到按DDD規範落地的3個的項目。對於領域驅動模型設計研發,從開始的各種疑惑到吸收各種先進的理念,目前在技術實施這一塊已經基本比較成熟。在既往經驗中總結了一些在開發中遇到的技術問題和解決方案進行分享。 ...
  • 原文鏈接: https://bysocket.com/openai-gpt4-plus-account-subscribe/ 瞭解如何購買和使用共用 GPT-4 賬號。通過OpenAI共用會員獲取GPT-4 賬號拼車服務。購買方式包括官方網站、第三方授權商、POE平臺和NewBing平臺。 一、GP ...
  • 三、基本數據類型和計算(二) 1、字元 #include <iostream> int main() { std::cout << 65 << std::endl; //65是一個int類型的整數 std::cout << (char)65 << std::endl; //將其轉化為1個位元組的cha ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...