Qiitaにログインしてダークテーマを使ってみませんか?🌙

ログインするとOSの設定にあわせたテーマカラーを使用できます!

3

この記事は最終更新日から1年以上が経過しています。

PyQtGraphとmatplotlibを真面目に比較する(Axes.plot相当)

最終更新日 投稿日 2021年08月12日

環境

  • Mac mini(M1) Big Sur
  • Python 3.9.6(arm64)
  • numpy 1.21.1
  • matplotlib 3.4.3
  • PyQtGraph 0.12.2

目標

 matplotlibで描いてるグラフをPyQtGraphで描けるようになる.

実習

 matplotlibのコードをコメントに書いた直後にPyQtGraphのコードを記述するという方式で進めます.matplotlibはオブジェクト指向で扱います.また以下のインポート文を前提とします.

import.py
import numpy as np
from matplotlib import pyplot as pet
import pyqtgraph as pg

np.random.seed(765)
x = np.linspace(0, 10, 100)
y = np.cos(x)
s = np.random.randn(100)/30

Artists

 公式から拾ってきたmatplotlibでいうところのArtistsの図です.これを念頭に置いておくと理解しやすいはずです.
IMG_3148.PNG

Axes.plot()

plot01.py
#fig, ax = plt.subplots()
win = pg.plot()

#ax.plot(x, y)
win.plot(x, y)

#fig.show()
win.exec()

これを実行すると新規ウィンドウでグラフが表示されます.
plot01.png
 そして右クリックすると保存(Export)の他にスペクトル表示や対数変換,微分,グリッド線の表示が後から変更できます.
スクリーンショット 2021-08-12 22.09.52.png
 なおグラフ1つだけであればmatplotlibのAxesのインスタンス化に相当する操作はなくても描けます.

plot02.py
win = pg.plot(x, y, title='cos curve')
pg.exec()

スクリーンショット 2021-08-12 22.16.03.png
 しれっと指定されてるtitleはウィンドウの名前です.ただし右クリックからの保存ではウィンドウ名は残らないため,グラフタイトルとは別です.

fig.savefig()

plot03.py
#fig.savefig('plot03.png')
import pyqtgraph.exporters
win = pg.plot(x, y, title='cos curve')
exporter = pg.exporters.ImageExporter(win.plotItem)
exporter.parameters()['width'] = 100
exporter.export('plot03.png')

 スクリプトでの保存は少し手間でした.まずpyqtgraph.exporterを明示的に読み込む必要があります.ただしインタラクティブシェルでGUIウィンドウにグラフを表示して右クリックから保存した後は不要になりました.次にexporterAxesならぬPlotItemを渡します.その次は幅を指定していますがなくても保存はできました.なおこの状態だと縦横比は固定のようで,幅を変えると縦も自動的に調整されました.最後は普通にファイル名の指定です.
 PlotItemを指定するということはあるウィンドウ中のグラフを全部保存したい時は個別なのか?と不安になりますが,ちゃんと一括保存する方法があります.後述する方法で複数のグラフをウィンドウに放り込んだ場合,exporter = pg.exporters.ImageExporter(win.scene())とすれば後は同じ様にして保存できました.

plt.subplots()

 複数のグラフを並べる方法です.

plot04.py
#fig, axes = plt.subplots(2, 2)
win = pg.GraphicsLayoutWidget(show=True)

#axes[0][0].plot(x, y)
p1 = win.addPlot(x=x, y=y)

#axes[0][1].plot(x, y)
p2 = win.addPlot(x=x, y=y)

#axes[1][0].plot(x, y)
win.nextRow()
p3 = win.addPlot(x=x, y=y)

#axes[1][1].plot(x, y)
p4 = win.addPlot(x=x, y=y)

 matplotlibと異なりデータはx=xなどと指定しないとエラーになりました.またshow=Trueは指定しないとグラフが表示できませんでした.parentパラメータが存在してそこにQWidgetというものを指定できるらしいですが,それをしない場合はshow=Trueが必要になるようです.行と列を明示したければ,

plot05.py
win = pg.GraphicsLayoutWidget(show=True)
for i in [0,1]:
    for j in [0,1]:
        win.addPlot(
                x=x, y=y,
                row=i, col=j
            )

plot05.png

 上のグラフはデータは全てy=cosxですが,右クリックしてスペクトル表示や微分(y),y vs yの表示に変更してあります.

結論

 とりあえず描いて保存はできる.保存は少し手間.

予定

  1. 散布図
  2. データ分析的な使い方ができるか
    (ヒストグラムとかカーネル密度分布とか)
  3. アニメーション表示と保存

などなど

追記

続編書きました.
データ分析用途は難しそうなのでplotlyでも使うのが良さそう.

追記2

アニメーション描画まで書きました.
保存まで試すのは時間かかりそうです.

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
  3. ダークテーマを利用できます
ログインすると使える機能について

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン

Qiita Advent Calendar 開催中!

Qiita Advent Calendarとは、カレンダーを埋めていく形で記事を投稿する記事投稿イベントです🎅

プレゼントがもらえるカレンダーや、全カレンダー対象のプレゼントも👀

記事をカレンダーに紐づけて、一緒にクリスマスを盛り上げましょう!

3