matplotlibとtkinterで3Dグラフ(応答曲面)を別ウインドに壁画する
1. はじめに
最近仕事で最適化パラーメータについて同僚に説明するため三次元グラフ(応答局面)を描きたい時があったのですが、Excelだと綺麗な3次元グラフを書くことが難しく、かといってこのためだけに有料のmatlabを使うのも気がひけるので、ささっとpythonで実装してみました。pythonだと記事冒頭Gifのようにグラフを動かすこともできるのが良いですね。
2. コード
import numpy as np
from matplotlib import pyplot as plt
import tkinter as tk
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
import matplotlib.colors
root = tk.Tk()
root.title("3次元グラフの表示テスト")
root.geometry("800x800")
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
X, Y = np.meshgrid(x, y)
Z=np.sqrt((np.square(X)+np.square(Y)))
plt.rcParams['font.size'] = 15
plt.rcParams['font.family'] = 'Arial'
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
ax1.set_xlabel('x', labelpad=10)
ax1.set_ylabel('y', labelpad=10)
ax1.set_zlabel('z', labelpad=10)
ax=ax1.plot_surface(X, Y, Z, cmap='jet',label="z")
cbar = fig.colorbar(ax, shrink = 0.6)
cbar.set_label("Z", fontsize=15)
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
root.mainloop()
上記のプログラミを実行すると記事冒頭のように別ウインドが開き、マウスで動かせる3Dグラフが現れます。
3. 説明
3.1 基本的なコード
基本的なコードは過去記事に紹介した「tkinterのウインド上にグラフを表示する方法」と同じです。過去記事は2次元グラフですが、今回は3次元グラフに変えたところが違いになります。
www.stjun.com
3.2 3次元グラフ
今回の大きな違いは以下2つです。
ax1 = fig.add_subplot(111, projection='3d')
ax=ax1.plot_surface(X, Y, Z, cmap='jet',label="z")
まず1行目の「projection='3d'」で3次元グラフであることを明記します。
次の2行目でsurface(X,Y,Z~~)とすることで応答局面を選びます。
例えばここを,
ax=ax1.plot_surface(X, Y, Z, label="z")
にすると面ではなくて3次元の散布図になります。
また,
ax=ax1.plot_wireframe(X, Y, Z, label="z")
にするとワイヤーフレーム表示になります。
ただ散布図もワイヤフレームも色が無くなってしまうので、plot_surfaceがおすすめです。
3.3 応答局面の色
ax=ax1.plot_surface(X, Y, Z, cmap='jet',label="z")
この文のcampのことです。「jet」は冒頭のように虹色になります。個人的にはその他のFEMソフトと同じこのjetが好みです。
matplotで使えるカラーマップは以下の公式HPで紹介されています。
Choosing Colormaps in Matplotlib — Matplotlib 3.5.2 documentation
例えば、cmap="CMRmap"にすると以下のように淡い色になります。
winterにすると以下のようになります。
bwrだと以下のようになります。
また単色系もあります。例えばGreysだと以下のように黒の単色になります。
4. おすすめ参考書
PyAutoGUIやOpenCVの使用方法が載っている書籍を紹介します。
この3つは非常に丁寧に書かれているのでお勧めです。
「Pythonで始めるOpenCV入門」と 「PythonでGUI自動化しよう」については、Amazonの月額読み放題サービス「Kindle unlimited」に加入していれば読み放題です。
初回30日間は無料、退会も簡単なので試しに読んでみてもよさそうです。