2021-11-17

PySide6 と Matplotlib

Python / NumPy のためのグラフ描画ライブラリである Matplotlib 3.5.0 がリリースされ、PySide6 (Qt for Python) で利用できるようになりました。待ちに待ったリリースだったので、早速、過去のサンプル [2] を手直しして実行できるようにしました。😁

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

Fedora 35 Workstation x86_64
qt_matplotlib.py の実行例
PySide6 6.2.1
matplotlib 3.5.0

サンプルコードを下記に示しました。

qt_matplotlib.py
#!/usr/bin/env python
# coding: utf-8
import PySide6
from PySide6.QtWidgets import (
QApplication,
QVBoxLayout,
QWidget
)
import sys
import pandas as pd
# Reference
# https://qiita.com/hiroyuki_kageyama/items/cb87a0bee98c0262a35e
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qtagg import NavigationToolbar2QT as NavigationToolbar
class Example(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('SPC Chart Example')
self.init_ui()
print('PySide6', PySide6.__version__)
print('matplotlib', matplotlib.__version__)
def init_ui(self):
# Example dataframe
df = pd.DataFrame({
'Sample': list(range(1, 11)),
'Y': [9.030, 8.810, 9.402, 8.664, 8.773, 8.774, 8.416, 9.101, 8.687, 8.767]
})
# SPC metrics
spec_usl = 9.97
spec_target = 8.70
spec_lsl = 7.43
value_mean = df.describe().at['mean', 'Y']
# _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
# SPC chart
fig = plt.figure(dpi=100)
ax = fig.add_subplot(111, title=self.windowTitle())
plt.subplots_adjust(bottom=0.2, left=0.2, right=0.8, top=0.9)
ax.grid(True)
# Horizontal Lines for SPC metrics
ax.axhline(y=spec_usl, linewidth=1, color='red', label='USL')
ax.axhline(y=spec_target, linewidth=1, color='blue', label='Target')
ax.axhline(y=spec_lsl, linewidth=1, color='red', label='LSL')
ax.axhline(y=value_mean, linewidth=1, color='green', label='Avg')
# Trend
ax.plot(df['Sample'], df['Y'], color="gray", marker="o", markersize=10)
ax.yaxis.label.set_color('gray')
ax.tick_params(axis='y', colors='gray')
# add extra ticks
extraticks = [spec_lsl, spec_target, spec_usl]
ax.set_yticks(list(ax.get_yticks()) + extraticks)
fig.canvas.draw()
# Labels
labels = [item.get_text() for item in ax.get_yticklabels()]
n = len(labels)
labels[n - 3] = 'LSL = ' + str(spec_lsl)
labels[n - 2] = 'Target = ' + str(spec_target)
labels[n - 1] = 'USL = ' + str(spec_usl)
ax.set_yticklabels(labels)
# Color
yticklabels = ax.get_yticklabels()
n = len(yticklabels)
yticklabels[n - 3].set_color('red')
yticklabels[n - 2].set_color('blue')
yticklabels[n - 1].set_color('red')
# add second y axis wish same range as first y axis
ax2 = ax.twinx()
ax2.set_ylim(ax.get_ylim())
ax2.tick_params(axis='y', colors='gray')
# add extra ticks
extraticks2 = [value_mean]
ax2.set_yticks(list(ax2.get_yticks()) + extraticks2)
# Label for second y axis
labels2 = [item.get_text() for item in ax2.get_yticklabels()]
n = len(labels2)
labels2[n - 1] = 'Avg = ' + str(value_mean)
ax2.set_yticklabels(labels2)
# Color for second y axis
yticklabels2 = ax2.get_yticklabels()
n = len(yticklabels2)
yticklabels2[n - 1].set_color('green')
# _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
# Canvas & Toolbar
canvas = FigureCanvas(fig)
toolbar = NavigationToolbar(canvas, self)
unwanted_buttons = ['Back', 'Forward']
for x in toolbar.actions():
if x.text() in unwanted_buttons:
toolbar.removeAction(x)
# _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
# Layout
layout = QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
layout.addWidget(toolbar)
layout.addWidget(canvas)
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()

今回は、GitHub のブログへの埋め込み方法として参考サイト [3] を参考にさせていただきました。

参考サイト

  1. Matplotlib documentation — Matplotlib 3.5.0 documentation
  2. bitWalk's: 【備忘録】Matplotlib で SPC チャート (3) [2020-11-26]
  3. GitHub Gistを使うとブログにコードを簡単、綺麗に表示できる【プラグインやライブラリ不要】 | うらなか書房のあやしいグッズあり〼 [2021-04-07]

 

 

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

0 件のコメント: