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) |
BarChart(棒グラフ)
BarChart(棒グラフ)は、縦軸(あるいは横軸)にデータ量をとり、棒の高さ(長さ)でデータの大小を表現したグラフです。
#!/usr/bin/env python | |
# coding: utf-8 | |
# Reference | |
# https://doc.qt.io/qt-6/qtcharts-barchart-example.html | |
import sys | |
from PySide6.QtCharts import ( | |
QBarCategoryAxis, | |
QBarSet, | |
QBarSeries, | |
QChart, | |
QChartView, | |
QValueAxis, | |
) | |
from PySide6.QtCore import Qt | |
from PySide6.QtGui import QPainter | |
from PySide6.QtWidgets import ( | |
QApplication, | |
QMainWindow, | |
) | |
class BarChart(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 | |
series = QBarSeries() | |
series.append(set0) | |
series.append(set1) | |
series.append(set2) | |
series.append(set3) | |
series.append(set4) | |
chart = QChart() | |
chart.addSeries(series) | |
chart.setTitle('Simple barchart example') | |
chart.setAnimationOptions(QChart.SeriesAnimations) | |
categories = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'] | |
axisX = QBarCategoryAxis() | |
axisX.append(categories) | |
chart.addAxis(axisX, Qt.AlignBottom) | |
series.attachAxis(axisX) | |
axisY = QValueAxis() | |
axisY.setRange(0, 15) | |
chart.addAxis(axisY, Qt.AlignLeft) | |
series.attachAxis(axisY) | |
chart.legend().setVisible(True) | |
chart.legend().setAlignment(Qt.AlignBottom) | |
return chart | |
class Example(QMainWindow): | |
def __init__(self): | |
super().__init__() | |
barchart = BarChart() | |
self.setCentralWidget(barchart) | |
self.resize(500, 300) | |
self.setWindowTitle('BarChart') | |
def main(): | |
app = QApplication(sys.argv) | |
ex = Example() | |
ex.show() | |
sys.exit(app.exec()) | |
if __name__ == '__main__': | |
main() |
実行例を下記に示しました。
基本的な作成方法は、QBarSet クラスのインスタンスに名前を付け set0 などと作成し、カテゴリ軸の各カテゴリに対応する棒(バー)の量(数値)を設定します。各カテゴリに複数の棒を表示する場合はその個数分の QBarSet のインスタンス set0, set1, ... を用意します。複数の QBarSet のインスタンスを単一の QBarSeries クラスのインスタンス series へ append メソッドで加えます。
QChart クラスのインスタンス chart を作成し、データ列のインスタンス series を addSeries メソッドで加えます。
次に、横軸 (axisX) と縦軸 (axisY) を定義します。横軸はカテゴリ軸 (QBarCategoryAxis) として、カテゴリのリストを append メソッドで定義した後、chart に軸位置 (Qt.AlignBottom) を指定して軸を定義します。これをデータ列 series に attachAxis メソッドで関連付けます。
縦軸は数値軸 (QValueAxis) としてインスタンスを生成した後、chart に軸位置 (Qt.AlignLeft) を指定して軸を定義します。これをデータ列 series に attachAxis メソッドで関連付けます。
set0 = QBarSet('Jane') set1 = QBarSet('John') ... ... set0 << 1 << 2 << 3 << 4 << 5 << 6 set1 << 5 << 0 << 0 << 4 << 0 << 7 ... ... series = QBarSeries() series.append(set0) series.append(set1) ... ... chart = QChart() chart.addSeries(series) ... ... categories = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'] axisX = QBarCategoryAxis() axisX.append(categories) chart.addAxis(axisX, Qt.AlignBottom) series.attachAxis(axisX) axisY = QValueAxis() axisY.setRange(0, 15) chart.addAxis(axisY, Qt.AlignLeft) series.attachAxis(axisY)
参考サイト

にほんブログ村
0 件のコメント:
コメントを投稿