2021-07-20

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

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)

LineChart(折れ線グラフ)と時間軸

LineChart(折れ線グラフ)は、時系列などの連続的変化をとらえるときに使用するグラフです。前回の記事 [3] では、肝心の時間軸のサンプルを示しませんでしたので、今回は時間軸を扱った折れ線グラフのサンプルを紹介します。

qtcharts_linechart_datetime.py

本サンプルでは、下記のテキストファイルをプロットするデータとして読み込んでいます。

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

qtcharts_linechart_datetime.py の実行例

ファイルを読み込んで、データ列 series への追加は、下記のスタティックメソッドで処理しています。

def datetime_data_reader(name_file):
    series = QLineSeries()

    with open(name_file) as f:
        for line in f:
            values = line.strip().split()
            if len(values) == 0:
                continue
            if values[0].startswith('#'):
                continue
            if values[0].startswith(':'):
                continue

            moment_in_time = QDateTime()
            moment_in_time.setDate(QDate(int(values[0]), int(values[1]), 15))
            series.append(moment_in_time.toMSecsSinceEpoch(), float(values[2]))

    return series

横軸(時間軸)axisX と縦軸 axisY はデフォルトの設定を使わずに、個別に設定しています。

        axisX = QDateTimeAxis()
        axisX.setTickCount(10)
        axisX.setFormat('MMM yyyy')
        axisX.setTitleText('Date')
        chart.addAxis(axisX, Qt.AlignBottom)
        series.attachAxis(axisX)
        axisY = QValueAxis()
        axisY.setTickCount(10)
        axisY.setLabelFormat('%i')
        axisY.setTitleText('Sunspots count')
        chart.addAxis(axisY, Qt.AlignLeft)
        series.attachAxis(axisY)

なお、日本語環境 ja_JP.UTF-8 下では、チャート横軸 (QDateTimeAxis) の目盛ラベルの表示について axisX.setFormat('MMM yyyy') と書式指定をしても、月の表示が '8月' などと表示されてしまいます。そこで、今回は LineChart クラスのコンストラクタ部でロケールを C に指定して、強制的に ’Aug' というように英語3文字の月名で表示するようにしています。

        QLocale.setDefault(QLocale.c())

参考サイト

  1. Qt Charts Examples | Qt Charts 6.1.2
  2. Qt for Python Examples — Qt for Python
  3. bitWalk's: Qt for Python によるチャート (1) [2021-07-19]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ Linuxへ
にほんブログ村
このエントリーをはてなブックマークに追加

0 件のコメント: