2021-07-22

Qt for Python によるチャート (4)

Python で GUI アプリを作成するときに Qt の Python 用バインディングである PySide (Qt for Python) を使用することが多くなりました。散布図などのチャート作成には、もっぱら matplotlib を使っていますが、他の選択肢も検討しようと、QtCharts というチャート作成用ライブラリの使い方をまとめました。

当初、PySide 用の QtCharts のサンプルが見つからず、C++ 用のサンプル [1] を PySide 用に書き直していましたが、よく探してみると PySide 用サンプルもありました [2]。ここでは、勉強がてら C++ 用のサンプルを書き直したものを紹介していきます。

本記事では、下記の OS 環境を使用しています。

Fedora 34 Workstation x86_64
- Python 3.9.6
- PySide6 6.1.2 (venv)
- IDE: PyCharm 2021.1.3 (Community Edition)

LineBarChart

LineBarChart は、折れ線グラフと棒グラフを合わせて表示するクラスです。

qtcharts_linebarchart.py
#!/usr/bin/env python
# coding: utf-8
# Reference
# https://doc.qt.io/qt-6/qtcharts-lineandbar-example.html
import sys
from PySide6.QtCharts import (
QBarCategoryAxis,
QBarSet,
QBarSeries,
QChart,
QChartView,
QLineSeries,
QValueAxis,
)
from PySide6.QtCore import (
QPoint,
Qt,
)
from PySide6.QtGui import QPainter
from PySide6.QtWidgets import (
QApplication,
QMainWindow,
)
class LineBarChart(QChartView):
def __init__(self):
super().__init__()
chart = self.init_ui()
self.setChart(chart)
self.setRenderHint(QPainter.Antialiasing)
def init_ui(self):
set0 = QBarSet('Jane')
set1 = QBarSet('John')
set2 = QBarSet('Axel')
set3 = QBarSet('Mary')
set4 = QBarSet('Samantha')
set0 << 1 << 2 << 3 << 4 << 5 << 6
set1 << 5 << 0 << 0 << 4 << 0 << 7
set2 << 3 << 5 << 8 << 13 << 8 << 5
set3 << 5 << 6 << 7 << 3 << 4 << 5
set4 << 9 << 7 << 5 << 3 << 1 << 2
barseries = QBarSeries()
barseries.append(set0)
barseries.append(set1)
barseries.append(set2)
barseries.append(set3)
barseries.append(set4)
lineseries = QLineSeries()
lineseries.setName('trend')
lineseries.append(QPoint(0, 4))
lineseries.append(QPoint(1, 15))
lineseries.append(QPoint(2, 20))
lineseries.append(QPoint(3, 4))
lineseries.append(QPoint(4, 12))
lineseries.append(QPoint(5, 17))
chart = QChart()
chart.addSeries(barseries)
chart.addSeries(lineseries)
chart.setTitle('Line and barchart example')
chart.setAnimationOptions(QChart.SeriesAnimations)
categories = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
axisX = QBarCategoryAxis()
axisX.append(categories)
chart.addAxis(axisX, Qt.AlignBottom)
lineseries.attachAxis(axisX)
barseries.attachAxis(axisX)
axisX.setRange('Jan', 'Jun');
axisY = QValueAxis()
chart.addAxis(axisY, Qt.AlignLeft)
lineseries.attachAxis(axisY)
barseries.attachAxis(axisY)
axisY.setRange(0, 20)
chart.legend().setVisible(True)
chart.legend().setAlignment(Qt.AlignBottom)
return chart
class Example(QMainWindow):
def __init__(self):
super().__init__()
linebarchart = LineBarChart()
self.setCentralWidget(linebarchart)
self.resize(500, 300)
self.setWindowTitle('LineBarChart')
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()

実行例を下記に示しました。

qtcharts_linebarchart.py の実行例

barseries = QBarSeries(), lineseries = QLineSeries() で棒グラフ、折れ線グラフのデータ列を準備し、X 軸 (axisX) および Y 軸 (axisY) にアタッチするだけです。

        categories = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
        axisX = QBarCategoryAxis()
        axisX.append(categories)
        chart.addAxis(axisX, Qt.AlignBottom)
        lineseries.attachAxis(axisX)
        barseries.attachAxis(axisX)
        axisX.setRange('Jan', 'Jun');
        axisY = QValueAxis()
        chart.addAxis(axisY, Qt.AlignLeft)
        lineseries.attachAxis(axisY)
        barseries.attachAxis(axisY)
        axisY.setRange(0, 20)

参考サイト

  1. Qt Charts Examples | Qt Charts 6.1.2
  2. Qt for Python Examples — Qt for Python

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ Linuxへ
にほんブログ村

0 件のコメント: