こんにちは、なおいです。
matplotlibというライブラリで前回3Dの散布図グラフを描きました。今回は2次元メッシュを描いてみようと思います。2次元のmatplotlib関連の最初の記事は以下から
2次元メッシュのプロット
1.基本
import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D import numpy as npdef 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次元でのプロットを行うために追加で必要になったコードです。プロットした結果は以下の通りです。
問題なくプロットされてます。とりあえずいろんな方向から見てみましょうか。
では、見た目をカスタマイズしていきます。
2.プロットの見た目をいじる
import matplotlib.pyplot as pltfrom 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()
今回はちょっと色の付け方を凝ってみました。カラーマップを使って、少しずつ色が変わるようにしてみました。
また、いつものように主要なカスタマイズキーワードを書いておきます。
次はグラフタイトルと軸のラベル等を入れましょう。
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" | 凡例名 |
色と形については、リファレンスを見ると以下のものが用意されているみたいです。
color example code: named_colors.py — Matplotlib 2.0.2 documentation
3.グラフの見た目をいじる
import matplotlib.pyplot as pltfrom 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()
先ほど同様、赤文字部を追加することで見た目のカスタマイズを行いました。二次元の時と違い、軸ラベルのつけ方が若干違います。
今回はここまでです。次回は何書きましょうかね。