プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/01/26

[PySide] QChart で棒グラフを作成

event_note2022/01/26 4:57

QChart を使って棒グラフを作成してみました。

公式のサンプルは以下です。

基本的な挙動は上記が理解しやすいと思いますが、実際にはループで処理することが多いと思うので、少し変更してみました。 pandas などと組み合わせれば大量のデータであっても効率的にグラフを作成できると思います。

環境

  • PySide 6.2.2.1

サンプル

import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import Qt
from PySide6.QtCharts import *
from PySide6.QtGui import QPainter, QCursor

class BarChartSample(QChartView):
    __categories = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
    __samples = {
        'Hoge': [9, 7, 5, 3, 1, 2],
        'Piyo': [3, 5, 8, 13, 8, 5],
        'Fuga': [5, 0, 0, 4, 0, 7],
        'Foo': [1, 2, 3, 4, 5, 6],
        'Bar': [5, 6, 7, 3, 4, 5],
    }

    def __init__(self, parent = None):
        super().__init__(parent)

        series = QBarSeries()
        #series = QStackedBarSeries()
        for key, values in self.__samples.items():
            barset = QBarSet(key)
            for value in values:
                barset.append(value)
            series.append(barset)

        chart = QChart()
        chart.addSeries(series)
        chart.setTitle('Barchart example')
        chart.setAnimationOptions(QChart.SeriesAnimations)

        axis_x = QBarCategoryAxis()
        axis_x.append(self.__categories)
        chart.addAxis(axis_x, Qt.AlignBottom)
        series.attachAxis(axis_x)

        axis_y = QValueAxis()
        chart.addAxis(axis_y, Qt.AlignLeft)
        series.attachAxis(axis_y)

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

        self.setRenderHint(QPainter.Antialiasing)
        self.setChart(chart)

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

        barchart = BarChartSample(self)
        self.setCentralWidget(barchart)

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

    window = MainWindows()
    window.show()
    window.resize(720, 480)
    sys.exit(app.exec())

QBarSeriesQStackedBarSeries に変更すれば積み上げグラフになります。