【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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...