Pythonで3Dグラフ表示 matplotlib,Axes3D 〜軸とカラーバーの表示〜

スポンサーリンク

前回のおさらいコード

まずは前回のおさらいコードから。

Pythonで3Dグラフ表示 matplotlib,Axes3D 〜基本編〜
データの準備これまでmatplotlibでは2次元データを扱ってきました。しかし時には3次元データを使うなんてこともあるでしょう。今回は簡単にですが、3次元データのプロットの仕方を解説していきます。まずは3...

今回は表面モデルを使っていきます。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data))

実行結果

3Dグラフになっているのですが、まだまだ味気ないですね。

これに色々追加して、見やすいグラフへとしていきましょう。

スポンサーリンク

タイトル、軸の名称の追加

タイトルを追加するには、ax.set_title(“タイトル”, fontsize=フォントサイズ)となります。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data))

ax.set_title("Title", fontsize=25)

実行結果

次は軸の名称を追加します。

それぞれ軸の名称を追加するには、

X軸の名称には、ax.set_xlabel(“X軸の名前”, fontsize=フォントサイズ)

Y軸の名称には、ax.set_ylabel(“Y軸の名前”, fontsize=フォントサイズ)

Z軸の名称には、ax.set_zlabel(“Z軸の名前”, fontsize=フォントサイズ)

となります。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data))

ax.set_title("Title", fontsize=25)
ax.set_xlabel("X", fontsize=20)
ax.set_ylabel("Y", fontsize=20)
ax.set_zlabel("Z", fontsize=20)

実行結果
スポンサーリンク

軸の数値のフォントサイズを変更

軸の数値のフォントサイズを変更するには、plt.tick_params(fontsize = フォントサイズ)を追加します。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data))

plt.tick_params(labelsize=20)
ax.set_title("Title", fontsize=25)
ax.set_xlabel("X", fontsize=20)
ax.set_ylabel("Y", fontsize=20)
ax.set_zlabel("Z", fontsize=20)

実行結果

今回はちょっと数値が切れてしまっているので、元のサイズで続けていきます。

スポンサーリンク

カラーバーを追加

Z軸の数値の変化がわかりやすいように、Z軸の数値によって色分けし、横にカラーバーを追加しましょう。

色分けするには、色分け用の色のセット(colormap)を使います。

どんな色があるかというのは、こちらのサイトを見ると分かりやすいです。

color example code: colormaps_reference.py — Matplotlib 2.0.2 documentation

今回は”Blues”を用いてみます。

まずはax.plot_surface()の中に、cmap=”Blues”を追加します。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data), cmap="Blues")

ax.set_title("Title", fontsize=25)
ax.set_xlabel("X", fontsize=20)
ax.set_ylabel("Y", fontsize=20)
ax.set_zlabel("Z", fontsize=20)

実行結果

ちょっと回転させていますが、確かに色が変わっています。

あまり綺麗に分かれていないのは、データ量が少ないからでしょう。

今回はこれで勘弁してもらいつつ、カラーバーの表示をしてみましょう。

カラーバーを表示するには、プログラムにfig.colorbar(カラーバーを追加するグラフ)を追加します。

今回、「カラーバーを追加するグラフ」というのは、surfになります。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data), cmap="Blues")
cbar = fig.colorbar(surf)

ax.set_title("Title", fontsize=25)
ax.set_xlabel("X", fontsize=20)
ax.set_ylabel("Y", fontsize=20)
ax.set_zlabel("Z", fontsize=20)

実行結果

このままではカラーバーが上下を突き破ってしまっているので、サイズを調整しましょう。

スポンサーリンク

カラーバーの長さを調節

カラーバーの長さを調節するには、fig.colorbar()にshrink = 比率 を追加します。

この比率というのは、縦の長さを1とした時の長さになります。

個人的には、0.75 (75%)程度がいいんじゃないかなと思います。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data), cmap="Blues")
cbar = fig.colorbar(surf, shrink = 0.75)

ax.set_title("Title", fontsize=25)
ax.set_xlabel("X", fontsize=20)
ax.set_ylabel("Y", fontsize=20)
ax.set_zlabel("Z", fontsize=20)

実行結果
スポンサーリンク

カラーバーの名称を追加

カラーバーの名称を追加するには、カラーバーをcbarに格納しているので、cbar.set_label(“カラーバーの名称”, fontsize=フォントサイズ)とします。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data), cmap="Blues")
cbar = fig.colorbar(surf, shrink = 0.75)

ax.set_title("Title", fontsize=25)
ax.set_xlabel("X", fontsize=20)
ax.set_ylabel("Y", fontsize=20)
ax.set_zlabel("Z", fontsize=20)

cbar.set_label("Color Bar", fontsize=20)

実行結果
スポンサーリンク

カラーバーの数値のサイズを変更

カラーバーの数値のサイズを変更するには、cbar.ax.tick_params(labelsize=フォントサイズ)を追加します。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data), cmap="Blues")
cbar = fig.colorbar(surf, shrink = 0.75)

ax.set_title("Title", fontsize=25)
ax.set_xlabel("X", fontsize=20)
ax.set_ylabel("Y", fontsize=20)
ax.set_zlabel("Z", fontsize=20)

cbar.set_label("Color Bar", fontsize=20)
cbar.ax.tick_params(labelsize=15)

実行結果
スポンサーリンク

カラーバーを水平に変更

最後にカラーバーを3Dプロットの横ではなく、下に移動し、水平にするには、fig.colorbar()にorientation=”horizontal”を追加します。

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

%matplotlib notebook

test_data = [[1, 2, 3, 4, 5], [9, 8, 7, 6, 5], [4, 7, 3, 8, 2], [1, 9, 4, 6, 3], [3, 7, 2, 6, 5]]

x = np.arange(len(test_data[0]))
y = np.arange(len(test_data))

X, Y = np.meshgrid(x, y)

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_surface(X, Y, np.array(test_data), cmap="Blues")
cbar = fig.colorbar(surf, shrink = 0.75, orientation="horizontal")

ax.set_title("Title", fontsize=25)
ax.set_xlabel("X", fontsize=20)
ax.set_ylabel("Y", fontsize=20)
ax.set_zlabel("Z", fontsize=20)

cbar.set_label("Color Bar", fontsize=15)
cbar.ax.tick_params(labelsize=15)

実行結果

見切れていますが、とりあえずこんな感じでカラーバーの方向を変更することができます。

これで3Dグラフも大体のことができるようになったと思います。

是非使ってみてください!

次回は自分で関数を作成するための関数、def関数に関して解説をしていきます。

Pythonで自分で関数を定義する方法 その1 〜def文の基本と注意点〜
自分の関数を定義する必要性今回はpythonのdef関数に関して、解説をしていきます。プログラミングをしていくと、何度も何度も同じ処理をするプログラムを書くことがでてくることでしょう。何度も書いていくと、どうしても...

ということで今回はこんな感じで。

コメント

タイトルとURLをコピーしました