明日の研究者になりたい

中国地方の某大学院博士課程に進学が決まったブログ.

Pythonで3Dグラフの軸ラベル位置を変える

3Dグラフを描画した際に軸ラベルのフォントサイズを変更するとどうしても軸の値と被ってしまい,位置の調整でかなり時間を使ってしまったので備忘録がてら手法を記します.

3Dプロット

3Dプロットにはmatplotlibのpyplotとmpl_toolkitsのmplot3dを使います.
グラフの例としては力センサから得た値をベクトルとして3次元空間上に表現するとします.
(値は何でも良いです)

import matplotlib.cm as cm #カラーマップ
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d
%matplotlib inline

X = np.linspace(5,10,10)
Y = np.linspace(0,20,10)
Z = np.linspace(-20,20,10)

figure = pyplot.figure(figsize=(10,10), facecolor='w')
ax = figure.gca(projection='3d')
xlabel = ax.set_xlabel("X-axis [N]")
ylabel = ax.set_ylabel("Z-axis [N]")
zlabel = ax.set_zlabel("Y-axis [N]")
ax.set_xlim(-20,20)
ax.set_ylim(-20,20)
ax.set_zlim(-20,20)
for i in range(len(X)):
    ax.plot([0,X[i]], [0,Y[i]], [0,Z[i]], "-^", color=cm.winter(200-(i+1)*20), ms=7, mew=0.5, lw=3)
    
    #3D空間上で原点が見にくいので,原点描画用
    ax.plot([-21,21], [0,0], [0,0], "-", color="gray", lw=1, linestyle = 'dotted')
    ax.plot([0,0], [-21,21], [0,0], "-", color="gray", lw=1, linestyle = 'dotted')
    ax.plot([0,0], [0,0], [-21,21], "-", color="gray", lw=1, linestyle = 'dotted')
    
    #3Dグラフの視点の変更
    ax.view_init(30, 30)

出力すると,
f:id:bigface00:20181108093426j:plain
のようになります.
でもこのままだと,軸ラベルが非常に見にくいですよね.
軸の値と軸ラベルの大きさを調整してみます.
軸の値はax.tick_paramsを追加し,

ax.tick_params(labelsize = 13)

軸ラベルにfontsizeを追加することでフォントサイズがそれぞれ変わります.

xlabel = ax.set_xlabel("X-axis [N]", fontsize = 18)
ylabel = ax.set_ylabel("Z-axis [N]", fontsize = 18)
zlabel = ax.set_zlabel("Y-axis [N]", fontsize = 18)

変更後の全体は

import matplotlib.cm as cm #カラーマップ
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d
%matplotlib inline

X = np.linspace(5,10,10)
Y = np.linspace(0,20,10)
Z = np.linspace(-20,20,10)

figure = pyplot.figure(figsize=(10,10), facecolor='w')
ax = figure.gca(projection='3d')
xlabel = ax.set_xlabel("X-axis [N]", fontsize = 18) ##fontsize追加
ylabel = ax.set_ylabel("Z-axis [N]", fontsize = 18) ##fontsize追加
zlabel = ax.set_zlabel("Y-axis [N]", fontsize = 18) ##fontsize追加
ax.set_xlim(-20,20)
ax.set_ylim(-20,20)
ax.set_zlim(-20,20)
for i in range(len(X)):
    ax.tick_params(labelsize = 13)##tick_params追加
    ax.plot([0,X[i]], [0,Y[i]], [0,Z[i]], "-^", color=cm.winter(200-(i+1)*20), ms=7, mew=0.5, lw=3)
    
    #3D空間上で原点が見にくいので,原点描画用
    ax.plot([-21,21], [0,0], [0,0], "-", color="gray", lw=1, linestyle = 'dotted')
    ax.plot([0,0], [-21,21], [0,0], "-", color="gray", lw=1, linestyle = 'dotted')
    ax.plot([0,0], [0,0], [-21,21], "-", color="gray", lw=1, linestyle = 'dotted')
    
    #3Dグラフの視点の変更
    ax.view_init(30, 30)
plt.savefig("output2.jpg")

出力すると,
f:id:bigface00:20181108093839j:plain
のようになり,軸ラベルが数値と被ってしまいます.
これではかなり不細工なので,軸ラベルの位置を調整したいと思います.
調整するには,

from matplotlib import rcParams
rcParams['axes.labelpad'] = 16

を追加するだけでいけます.
rcParams['axes.labelpad'] はX,Y,Z全ての軸ラベルをまとめて調整することが可能です.
出力すると,
f:id:bigface00:20181108095934j:plain
となり,軸ラベル全体でばっちりマージンがとれています.
rcParamsではmatplotlibのパラメータを調整することができます(下記サイトが参考になると思います).
qiita.com