前提
初投稿です。
皆様におかれましては日々の実験結果を図にまとめていらっしゃると思います。最終的には論文投稿を目指すことになりますが、その際に図の体裁にかなり気を配ることになり、基本的なグラフ作成のガイドラインを参照しながら頑張ることになると思います。
特に、対数軸を使う時には目盛に気を付ける必要があり、例えば、$10^0$,$10^1$,$10^2$の点には長めの主目盛(major ticks)を描き、$10^0$と$10^1$の間には$2,3,4,,,$の点に副目盛(minor ticks)描く必要があります。
筆者がpython3のmatplotlib.pyplotで図を作る際にminor ticks(副目盛)を表示できないという問題に遭遇しました。本記事では私の取った対処法を記します。
#環境
Python 3.7.3
Anaconda 2019.03
Jupyter notebook 5.7.8
状況
実験データを両対数グラフで表示します。
##問題
今回問題に出くわしたコードです。
import matplotlib.pyplot as plt
# begin 本日いじるところ
plt.figure(figsize=(8,8)) #図の大きさ
plt.rcParams["font.size"] = 36 #文字の大きさ
plt.tick_params(which ="major",direction = 'in' ,axis="both"
, length = 20 ,width = 2 ,pad = 10)
#major ticks の大きさ
plt.tick_params(which ="minor",direction = 'in' ,axis="both"
, length = 10 ,width = 1)
#minor ticks の大きさ
# end 本日いじるところ
plt.xscale("log")
plt.yscale("log")
plt.xlim(10**1,10**6*3)
plt.ylim(0.5,10**4*2)
plt.xticks(10**np.arange(0,7,1))
plt.yticks(10**np.arange(0,5,1))
plt.xlabel("Time, " +r"$t$")
plt.ylabel("Number of RNA")
# 実験データ描画
param1 = [4,3,2,0]
param2 = [0,3,7,-1]
for i,j in zip(param1,param2):
plt.plot(TimeList,A_3[:,i,j] ,linewidth = 5 ,zorder = 1)
plt.tight_layout()
plt.savefig("qiita\\dis1.png")
plt.show()
実行すると
が得られます。横軸にもminor ticksを表示する設定のはずが表示されません。これはplt.tick_params()をいじっても解決しませんでした。
##解決策1-グラフを大きくする。
純粋に軸が狭いから表示を渋っているだけでは?という発想。作者の気持ちを考えていく。
import matplotlib.pyplot as plt
# begin 本日いじるところ
plt.figure(figsize=(14,8)) #図の幅を広げた
plt.rcParams["font.size"] = 36 #文字の大きさ
plt.tick_params(which ="major",direction = 'in' ,axis="both"
, length = 20 ,width = 2 ,pad = 10)
#major ticks の大きさ
plt.tick_params(which ="minor",direction = 'in' ,axis="both"
, length = 10 ,width = 1)
#minor ticks の大きさ
# end 本日いじるところ
#中略
plt.savefig("qiita\\dis2.png")
plt.show()
実行すると
無事minor ticksが表示されました。よかったですね。
##解決策2-文字を小さくする。
窮屈なのがいけないんだな、という所感からやっていきましょう。
import matplotlib.pyplot as plt
# begin 本日いじるところ
plt.figure(figsize=(8,8)) #図の大きさは戻した
plt.rcParams["font.size"] = 20 #文字を小さくした
plt.tick_params(which ="major",direction = 'in' ,axis="both"
, length = 20 ,width = 2 ,pad = 10)
#major ticks の大きさ
plt.tick_params(which ="minor",direction = 'in' ,axis="both"
, length = 10 ,width = 1)
#minor ticks の大きさ
# end 本日いじるところ
#中略
plt.savefig("qiita\\dis3.png")
plt.show()
実行すると
無事minor ticksが表示されました。よかったですね。
#結論
図の中身が犇めき合っていると、想定した部品が表示されないことがあるようですね。今回は完全な現象論的アプローチだったのでエンジニア的には褒められたものではないかもしれませんね。
しかし、こんな些細なことで貴重な時間を失ってしまう人が1人でも減ればうれしいです。