しぷぜん

しぷぜん

素人プログラマなおいがStep Zero to Oneしていくブログ

Pythonでデータを可視化するmatplotlib初級(2次元メッシュ編)

にほんブログ村 IT技術ブログ Pythonへ

こんにちは、なおいです。

matplotlibというライブラリで前回3Dの散布図グラフを描きました。今回は2次元メッシュを描いてみようと思います。2次元のmatplotlib関連の最初の記事は以下から

  

ct-innovation01.hateblo.jp

  

 

 

 f:id:ct-innovation01:20170927160405p:plain

 

2次元メッシュのプロット

1.基本
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

def func(x,y):
    return (np.sin(x))* (np.cos(y)-x)**2

x = np.arange(-5, 5, 0.25)
y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(x, y)
Z = func(X, Y)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Z)
plt.show()

2次元メッシュなのでうねうねしたほうがいいかなと思い、今回はnumpyを利用して関数を作成しました。青字が関数の定義と実データの作成部です。

-5~5までの範囲の総組合せの配列を作成してそれぞれの時の関数の結果をZに入れています。また、赤文字が3次元でのプロットを行うために追加で必要になったコードです。プロットした結果は以下の通りです。

 

f:id:ct-innovation01:20171018185520p:plain

 

問題なくプロットされてます。とりあえずいろんな方向から見てみましょうか。

 

f:id:ct-innovation01:20171013133046g:plain

 では、見た目をカスタマイズしていきます。

 

2.プロットの見た目をいじる
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import cm

def func(x,y):
    return (np.sin(x))* (np.cos(y)-x)**2

def min_max(x, axis=None):
    min = x.min(axis=axis, keepdims=True)
    max = x.max(axis=axis, keepdims=True)
    result = (x-min)/(max-min)
    return result

x = np.arange(-5, 5, 0.25)
y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(x, y)
Z = func(X, Y)

c = min_max(x)
cmap = plt.get_cmap("Blues")

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Z,colors=cmap(c))
plt.show()

今回はちょっと色の付け方を凝ってみました。カラーマップを使って、少しずつ色が変わるようにしてみました。

また、いつものように主要なカスタマイズキーワードを書いておきます。

 

f:id:ct-innovation01:20171020205653p:plain

 

次はグラフタイトルと軸のラベル等を入れましょう。

 

 

 

Tips)プロットに付与できる主要なカスタマイズキーワード

いつも通り最低限これだけおさえてれいれば、普通のグラフは書けるかなという範囲のみ記載しておきます。

kywd 入力例 備考
x,y,z [1,2,3,4,5] または 事前に定義したlistなど array形式のもの
※必須
c c="red" または
c="#FFFF00" または
c=(1.0,0,1.0)
ラインの色
色名や16進数、RGBでの指定が可能
label label="label1" 凡例名

色と形については、リファレンスを見ると以下のものが用意されているみたいです。

f:id:ct-innovation01:20170927115343p:plain

color example code: named_colors.py — Matplotlib 2.0.2 documentation

 

3.グラフの見た目をいじる
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = [1, 2, 3, 4, 5]
y = [1, 8, 3, 6, 5]
z = [1, 5, 3, 8, 9]

ax.scatter(x, y, z, c='r', marker='^', label='test')
ax.legend()
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

先ほど同様、赤文字部を追加することで見た目のカスタマイズを行いました。二次元の時と違い、軸ラベルのつけ方が若干違います。

 

f:id:ct-innovation01:20171020215312p:plain

  

今回はここまでです。次回は何書きましょうかね。