Pythonで「Point & Figure」チャートを描画する。(4)
これまでにMatplotlibの散布図を活用してPoint&Figureチャートを描画する仕組みまでは確認できました。Point&Figureの描画するコードのモジュール化を検討する前に、ラベルやグリッド表示など、グラフの汎用要素をカスタマイズしてPoint&Figureに適したグラフ描画にしていきます。
Matplotlibによるグラフの描画は、まず、台紙となるFigureオブジェクトを作成し、そこに付箋紙としてAxesオブジェクトを貼り付けて、その付箋紙にプロットしていくというイメージで捉えるとFigureとAxesの関係が理解しやすいです。従って、実際にチャートがプロットされるのはAxesオブジェクトになります。
グラフは目的に応じて様々な形状で表現されますが、どんな種類のグラフであっても共通する要素があります。これらの共通要素は、Axesオブジェクトに対して設定を行います。
▼ グラフ描画における共通要素
グラフタイトル
X軸、Y軸の範囲
X軸、Y軸の目盛り
X軸、Y軸のラベル
グリッド表示
凡 例
(1) グラフタイトル (set_title)
グラフタイトルは set_titleメソッドで指定します。
ax.set_title(‘Point&Figure - USD/JPY - Daily’)
(2) X軸、Y軸の範囲 (xlim, ylim)
set_xlim 及び set_ylimメソッドでそれぞれX軸とY軸の描画範囲を指定することができます。
ax.set_xlim(left=0, right=54)
ax.set_ylim(bottom=85, top=110)
Point&Figureの場合、時間軸の概念が存在しないためX軸の範囲は枠転換した回数だけ必要となります。
Y軸については、プロットする時系列データの最大値、最小値+αを設定することでグラフの見栄えを調整することになります。
(3) X軸、Y軸の目盛り (xticks, yticks)
デフォルトではX軸、Y軸の範囲にあわせて自動的に目盛りが表示されます。目盛りを任意の値に表示させるには、個別に任意の値を指定するか、表示間隔又は等配分するためのルールを引数に指定します。
目盛りを任意の値に指定するには、xticks、yticksメソッドを使用し、第1引数に目盛りを挿入する位置、第2引数に目盛りの値をそれぞれ配列として渡します。
plt.xticks([目盛りを挿入する位置], [目盛りの値])
plt.xticks([1,2,3,4,5], [10,20,30,40,50])
plt.yticks([1,2,3,4,5], ["A","B","C","D","E"])
その他にも以下のような指定方法もあります。
(例)個別に任意の値を目盛りに指定する。
X軸に 10,20,30 の目盛りを配置する。
plt.xticks([0, 10, 20, 30])
(例)指定した範囲で等間隔で目盛りを配置する。
0から101の範囲で、X軸の目盛りを11個(10等分)表示する。
plt.xticks(0, 101, 11)
また、X軸とY軸には目盛り線(メジャー:major_ticks とマイナー:minor_ticks)を描画することができます。
(例)指定した範囲で等差数列の目盛りを配置する。
0から101の範囲で、目盛り線(メジャー)を20ごとに、目盛り線(マイナー)を5ごとに目盛りを配置する。
import numpy as np
major_ticks = np.arange(0, 101, 20)
minor_ticks = np.arange(0, 101, 5)
目盛りの配置方法を指定後、Axesそれぞれの目盛り線を set_xticks, set_yticksメソッドにより描画します。
ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor=True)
ax.set_yticks(major_ticks)
ax.set_yticks(minor_ticks, minor=True)
Point&Figureの場合、時間軸の概念が存在しないためX軸の目盛りラベルは必要ありません。tick_paramsメソッドで指定した軸目盛りラベルを非表示とすることができます。軸目盛りラベルの位置の引数に False を指定することで非表示になります。
ax.tick_params(labelbottom=False,
labelleft=False,
labelright=False,
labeltop=False)
X軸の目盛りラベルを非表示とするので、labelbottom のみ False を指定します。ちなみに、全ての目盛りラベルを非表示とする場合、以下のコードで設定できます。
ax.tick_params(…)
(4) X軸、Y軸のラベル (set_xlabel, set_ylabel)
set_xlabel 及び set_ylabelメソッドでそれぞれX軸とY軸のラベルを設定することができます。
ax.set_xlabel(‘時間’)
ax.set_ylabel(‘為替レート’)
Point&Figureの場合、時間軸の概念が存在しないためX軸のラベル表示は不要となります。Y軸についても株価や為替レートであることをわざわざラベルとして表示する必要はありません。
(5) グリッド表示 (grid)
gridメソッドの引数にTrueを設定するとグリッドを表示することができます。
ax.grid(True)
この記述ではX軸、Y軸の目盛り表示にあわせてグリッドが表示されるだけです。Point&Figureの枠に該当するよう格子状にグリッドを表示させるには、目盛りの配置を調整した上で、方眼線(メジャー)と補助線(マイナー)にグリッドを表示するように指定します。
(例)方眼線(メジャー)と補助線(マイナー)に透明度を設定してグリッドを表示する。
ax.grid(which='major', alpha=0.2)
ax.grid(which='minor', alpha=0.2)
(6) 凡 例 (legend)
legendメソッドでグラフの凡例を表示することができます。
引数に系列ごとのリスト(配列)を設定します。
ax.legend(説明リスト)
Point&Figureでは凡例を表示する必要はありません。
この他にも matplotlib のグラフ描画における共通要素には様々なメソッドがありますが、Point&Figure においてはこれらの基本要素を用いて見栄えの良いグラフ描画を追求していきたいと思います。
なお、matplotlibでは、デフォルトでグラフタイトルや軸ラベル等に日本語を表示させることはできません。(文字化けします。)
matplotlibのグラフで日本語を表示させる方法については別記事としてまとめました。
(7) Point&Figureチャートとしての見栄えを整える。
Point&Figureは、グリッド線で区切られた枠の中にマーカーを描画する必要があリますので、グリッド間隔にあわせてマーカーの描画位置を調整することとなります。
グリッド線の中心に散布図のマーカーが表示されるように調整してみました。
見た目としては、Point&Figureチャートとして遜色ないレベルにすることができました。このグラフ描画をベースにして、今後は Point&Figure 描画のモジュール化を進めていきたいと思います。