返回

图文教程 | Qt层叠柱状图、百分比柱状图和饼图的实现

后端

层次分明:层叠柱状图和饼图揭开数据背后的故事

层叠柱状图:揭示数据的层级结构

层叠柱状图是可视化比较不同类别中两个或多个数据集值的强大工具。通过将柱状条长度叠加,它可以轻松地揭示每个类别中各个值所占的相对份额。

举个例子,一家电子商务公司可以使用层叠柱状图来比较不同产品类别在不同季度内的销售额。该图表将显示每个产品类别在每个季度所占的百分比,从而帮助公司识别最畅销的产品和最具获利性的时期。

百分比柱状图:关注数据中的相对大小

百分比柱状图通过将每个柱状条的长度表示为其在总值中所占的百分比,专注于不同类别的相对大小。它可以清晰地显示每个类别对整体数据集的贡献。

例如,一家非营利组织可以使用百分比柱状图来展示其捐赠资金的来源。该图表将显示来自个人、企业和基金会等不同来源的资金百分比,帮助组织了解其收入流的组成。

饼图:展示整体格局

饼图是一种直观的图表,可以显示不同类别的相对大小。它将数据集表示为一个圆,其中每个扇区的面积与该类别在总值中所占的百分比成比例。

一家食品公司可以使用饼图来展示其产品组合中不同类型的食品。该图表将显示披萨、汉堡、沙拉和其他食品类别的份额,帮助公司了解其产品重点。

实现步骤:使用 Python 和 PyQt5 创建交互式图表

使用 Python 和 PyQt5 等库,可以轻松创建交互式层叠柱状图、百分比柱状图和饼图。这些图表不仅信息丰富,而且可以通过按钮点击轻松切换,从而提供全面的数据可视化体验。

# 导入必要的库
import PyQt5
from PyQt5.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QGridLayout, QLabel, QPushButton, QGraphicsScene, QGraphicsView, QGraphicsItem
from PyQt5.QtCore import QRectF, Qt, QPointF
from PyQt5.QtGui import QPen, QColor, QBrush

# 创建主窗口
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("PyQt5可视化 - 柱状图和饼图")
        self.setGeometry(100, 100, 800, 600)

        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)

        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        self.button_layout = QGridLayout()
        self.layout.addLayout(self.button_layout)

        self.stacked_widget = QStackedWidget()
        self.layout.addWidget(self.stacked_widget)

        self.create_buttons()
        self.create_stacked_widget()

# 创建按钮
self.button_stacked_bar_chart = QPushButton("层叠柱状图")
self.button_stacked_bar_chart.clicked.connect(self.show_stacked_bar_chart)

self.button_percentage_bar_chart = QPushButton("百分比柱状图")
self.button_percentage_bar_chart.clicked.connect(self.show_percentage_bar_chart)

self.button_pie_chart = QPushButton("饼图")
self.button_pie_chart.clicked.connect(self.show_pie_chart)

self.button_layout.addWidget(self.button_stacked_bar_chart, 0, 0)
self.button_layout.addWidget(self.button_percentage_bar_chart, 0, 1)
self.button_layout.addWidget(self.button_pie_chart, 0, 2)

# 创建StackedWidget
self.stacked_widget.addWidget(self.stacked_bar_chart)
self.stacked_widget.addWidget(self.percentage_bar_chart)
self.stacked_widget.addWidget(self.pie_chart)

# 创建层叠柱状图
self.stacked_bar_chart = QGraphicsView()
self.stacked_bar_chart_scene = QGraphicsScene()
self.stacked_bar_chart_scene.setSceneRect(0, 0, 800, 600)
self.stacked_bar_chart.setScene(self.stacked_bar_chart_scene)

self.stacked_bar_chart_data = [
    [10, 20, 30],
    [20, 30, 40],
    [30, 40, 50],
]

self.stacked_bar_chart_colors = [
    QColor(255, 0, 0),
    QColor(0, 255, 0),
    QColor(0, 0, 255),
]

self.stacked_bar_chart_width = 50
self.stacked_bar_chart_spacing = 10

for i, data in enumerate(self.stacked_bar_chart_data):
    for j, value in enumerate(data):
        rect = QRectF(
            self.stacked_bar_chart_width * i + self.stacked_bar_chart_spacing * i,
            600 - self.stacked_bar_chart_width * j - self.stacked_bar_chart_spacing * j,
            self.stacked_bar_chart_width,
            self.stacked_bar_chart_width * value / 100,
        )
        item = QGraphicsItem()
        item.setRect(rect)
        item.setPen(QPen(Qt.NoPen))
        item.setBrush(QBrush(self.stacked_bar_chart_colors[j]))
        self.stacked_bar_chart_scene.addItem(item)

# 创建百分比柱状图
self.percentage_bar_chart = QGraphicsView()
self.percentage_bar_chart_scene = QGraphicsScene()
self.percentage_bar_chart_scene.setSceneRect(0, 0, 800, 600)
self.percentage_bar_chart.setScene(self.percentage_bar_chart_scene)

self.percentage_bar_chart_data = [
    10,
    20,
    30,
    40,
    50,
]

self.percentage_bar_chart_colors = [
    QColor(255, 0, 0),
    QColor(0, 255, 0),
    QColor(0, 0, 255),
    QColor(255, 255, 0),
    QColor(255, 0, 255),
]

self.percentage_bar_chart_width = 50
self.percentage_bar_chart_spacing = 10

for i, value in enumerate(self.percentage_bar_chart_data):
    rect = QRectF(
        self.percentage_bar_chart_width * i + self.percentage_bar_chart_spacing * i,
        600 - self.percentage_bar_chart_width * value / 100,
        self.percentage_bar_chart_width,
        self.percentage_bar_chart_width * value / 100,
    )
    item = QGraphicsItem()
    item.setRect(rect)
    item.setPen(QPen(Qt.NoPen))
    item.setBrush(QBrush(self.percentage_bar_chart_colors[i]))
    self.percentage_bar_chart_scene.addItem(item)

# 创建饼图
self.pie_chart = QGraphicsView()
self.pie_chart_scene = QGraphicsScene()
self.pie_chart_scene.setSceneRect(0, 0, 800, 600)
self.pie_chart.setScene(self.pie_chart_scene)

self.pie_chart_data = [
    10,
    20,
    30,
    40,
    50,
]

self.pie_chart_colors = [
    QColor(255, 0, 0),
    QColor(0, 255, 0),
    QColor(0, 0, 255),
    QColor(255, 255, 0),
    QColor(255, 0, 255),
]

self.pie_chart_radius = 200

for i, value in enumerate(self.pie_chart_data):
    start_angle = -90 * 16
    end_angle = -90 * 16 + 360 * value / 100
    path = QPainter