マインクラフト JavaEdition公開サーバ「ThlivingServer」はコチラ!

グラフ描画GUIを作ってみたお話②(アレニウスプロット)

概要

前回のブログに書いてたようにtkinterとかいろいろについて解説しようかなぁと考えていましたが、アレニウスプロットを実装したので、それを先に説明します。

アレニウスプロットの作り方

上の図を作成します。やることは、

  • 下側のx軸に対応する主目盛の生成
  • 下側のx軸に対応する補助目盛の生成

の2つになります。補助目盛は主目盛に合わせて自動で生成してくれると非常に楽なので、自動生成できるようにしました。コードは以下の通り。

import numpy as np
import math
import matplotlib.pyplot as plt

x = [2, 5, 8, 10, 20]  #1000/Tのデータ 左から50, 100, 125, 200, 500K
y = [2, 5, 8, 10, 20]  #今回は分かりやすいようにy=xを描画する

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
plt.plot(x,y)
ax1.tick_params(labelsize=15, direction='in', which='both', top=True, right=True)

ax2 = ax1.twiny()           #twinyでy軸を共有する第2x軸を作成

#ここから上の軸の目盛生成
xmin, xmax = ax1.get_xlim()
xmin = xmin/1000
xmax = xmax/1000

#主目盛
major_tick = [50,100,500]                     #主目盛とする値
tickinv = [1/float(T) for T in major_tick]    #温度の逆数を生成
ax2.set_xticks(tickinv)                       #①第2x軸に温度の逆数を設定
ax2.set_xticklabels(major_tick)               #②主目盛のラベル設定
ax2.set_xlim(xmin,xmax)                       #③第2x軸の上限と下限設定

#補助目盛
minor_tick = []
n = len(major_tick)
for i in range(n-1):
    tick_interval = 10**int(math.log10(float(major_tick[i])))
    tick1 = float(major_tick[i])
    tick2 = float(major_tick[i+1])
    while(tick1<tick2):
        minor_tick.append(1/tick1)
        tick1 = tick1 + tick_interval

ax2.xaxis.set_minor_locator(plt.FixedLocator(minor_tick))

#軸ラベルの設定
ax1.set_xlabel("1000/T [K$^{-1}$]", fontsize = 20)
ax1.set_ylabel("y=1/T", fontsize = 20)
ax2.set_xlabel("Temperature [K]", fontsize = 20)

#ax1.tick_paramsをここに置くとグラフがおかしくなるので注意
ax2.tick_params(labelsize=15, direction='in', which='both', top=True, right=True)

plt.show()

第2x軸の作り方のイメージはこんな感じ

  • 1/T軸上でmajor_ticksに対応する位置に目盛を設定する。
  • ラベルを付ける。
  • 第2x軸の上限(xmax)と下限(xmin)を設定する。xmin<xmaxなので上の図が左右反転する。

ここに補助目盛を追加していきます。今回は10~100までは10おきに、100~1000までは100おきに補助目盛を描画します。10~100までであるかどうか、100~1000までであるかどうかを一般的に判定するには桁数を使うと簡単そうなので

math.log10(float(major_tick[i]))

これを使います(厳密には桁数-1です)。major_tickは[50,100,500]のリストなので、minor_tickには50,60,…,90,100,200,…,500に対応する逆数を入れればいいです(ふと気づきましたが、majorとminorで中身が違うのは気持ち悪いですね。まあ動くのでヨシ!)。

あとは単純作業でwhileでひたすらminor_tickにappendしていきます。

そして、set_minor_locatorの引数にFixedLocator(minor_tick)を入れて終わりです。ちなみにFixedLocatorは任意の目盛の生成に使うやつです。

なぜmatplotlibにデフォルトでアレニウスプロットがないのか非常に不思議ですが、とりあえず上のコードをちょっと改変すれば自分好みのアレニウスプロットができるのではないでしょうか?補助目盛も任意のものにしたければminor_tickを適当なlistにすれば良いですね。

コメント

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