pythonのmatplotlibを使って3Dの棒グラフを作って書き出す

3Dグラフって見にくく感じるたちなので基本的には好きじゃないのだけど、二つの変数に対しての変化を見たい時に、代替手段がないこともある。

最初エクセルで作ろうと思ったんだけど、意外とエクセルは3Dのグラフを作るのは便利じゃなさそうな感じだった。

じゃあまあpythonか、ってことでmatplotlibで3Dグラフを作ってみた。

最初3Dのプロットを作ろうと思って調べていたら、Axes3D.barがなんとなく使えそうな感じ。

外部リンク: matplotlib公式 mplot3d tutorial

だけどこのファンクションで棒グラフを実際に作ってみると、ぺったりした薄い棒グラフであんまり綺麗じゃない。
設定で変えれないかなと色々調べたんだけど、途中でaxes3Dには最初からbar3dっていうファンクションがあることに気づく。

外部リンク: 公式 Demo of 3D bar charts

というわけで以下はこのbar3dを使って3Dの棒グラフを作る一例。

importはmatplotlibとAxes3Dくらい。

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

まずはいつも通り、最初に適当に描画設定をする。

plt.rcParams['font.family']='Arial'
plt.rcParams['font.size']= 14
plt.rcParams['axes.linewidth']=2.5
plt.rcParams['xtick.major.width']=2.5
plt.rcParams['xtick.labelsize']=14
plt.rcParams['ytick.major.width']=2.5
plt.rcParams['ytick.labelsize']=14
plt.rcParams['figure.figsize']=(8,6)

続いて適当にX軸とY軸を設定。同じYの値に二つのデータを突っ込んで見たくてこんな感じの値を与えてみた。
多分もっといい書き方があるはずだけど、まあpyhtonは動けばいいんだよ派なので気にしない。

X = np.array([0,0.5,1,2,3])
Y1 = np.array([1.12])
Y2 = np.array([2.12])
Y3 = np.array([3.12])
Y4 = np.array([0.88])
Y5 = np.array([1.88])
Y6 = np.array([2.88])

続けてZ軸のスタートポジションを設定。
ちょっとデータを入れたくないポジションがあって、スタートポジション外して消してたんだけど、これももっといい消し方があるんと違うかな。でも動けばいいんだよ派なので……(略

Z0 = np.array([-1020,0,0,0,0])
Z01 = np.array([-1020,-1020,0,0,0])
Z = np.array([0,0,0,0,0])

続いてZ軸の高さの値を設定。

Z1 = np.array([0,19,12,8,7])
Z2 = np.array([16,9,8,6,5])
Z3 = np.array([9,8,6,5,4])
Z4 = np.array([0,0,26,16,13])
Z5 = np.array([29,14,16,12,11])
Z6 = np.array([15,16,12,5,8])

様式美からデータのプロットへ。dx,dzで棒グラフの形を決めて、dzは棒グラフの高さ。
そうそう、特定条件のpythonやら何やら使ってると、アルファ値設定しても透明にならないバグがある。
一応修正できるっぽかったけど、直すの結構面倒くさそうだったのでスキップ。そもそもpythonかmatplotlibのバージョン変えれば直るんじゃないかな。

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.bar3d(X,Y4,Z01,dx=0.19,dy=0.2,dz=Z4,shade=True)
ax.bar3d(X,Y5,Z,dx=0.19,dy=0.2,dz=Z5,shade=True)
ax.bar3d(X,Y6,Z,dx=0.19,dy=0.2,dz=Z6,shade=True)
ax.bar3d(X,Y1,Z0,dx=0.19,dy=0.2,dz=Z1,shade=True)
ax.bar3d(X,Y2,Z,dx=0.19,dy=0.2,dz=Z2,shade=True)
ax.bar3d(X,Y3,Z,dx=0.19,dy=0.2,dz=Z3,shade=True)

続けて軸やら表示の微調整。

ax.set_yticks([1,2,3])
ax.set_xticks([0,1,2,3])
ax.set_xlabel('condition1')
ax.set_ylabel('condition2')
plt.xlim(0,3)
plt.ylim(3.5,0.5)
ax.set_zlim(0,50)

最後に絵をセーブして、見せておしまい。

plt.savefig('FIGURE/'+'orig.png', bbox_inches='tight')
plt.show()

でグラフはこんな感じになる。

3Dバーの例

まあそんなに見やすくもないけど、なんとなく雰囲気は掴める3D棒グラフになりました。

最後はうちのKatja。

Katjaのご尊顔

棚の上に落ち着いたKatja

メリークリスマス!

関連記事

1. pythonのまとめ

D