機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

Pythonで3次元グラフを描く

matplotlibとtkinterで3Dグラフ(応答曲面)を別ウインドに壁画する

3次元グラフを動かしている様子

 

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) # x軸を作成
y = np.arange(-10, 10, 0.1) # y軸を作成
X, Y = np.meshgrid(x, y)    # グリッドデータの作成
Z=np.sqrt((np.square(X)+np.square(Y))) #Z軸を作成

# フォントの種類とサイズを設定する。
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)

# グラフを表示する。
#tkinterのウインド上部にグラフを表示する
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)

#tkinterのウインド下部にツールを追加する
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で始めるOpenCV入門

 

Pythonで始めるOpenCV入門」と 「PythonGUI自動化しよう」については、Amazonの月額読み放題サービス「Kindle unlimited」に加入していれば読み放題です。

初回30日間は無料、退会も簡単なので試しに読んでみてもよさそうです。