Pythonで「Point & Figure」チャートを描画する。(3)
今回は、Matplotlibで実際に数値をプロットしてみます。
参考にしているコードを見てみると、Axes の scatterメソッドを使用して数値をプロットしています。
ax.scatter(x, y, marker=symbol[sign(chg)], s=175)
scatter は散布図を描画するメソッドで、参考コードは散布図のロジックでPoint&Figureチャートを描画しているようです。
散布図を描画するメソッド:scatter
散布図は英語で「scatter plot」と呼称され、matplotlib.pyplot クラスに scatterメソッドが用意されており、簡単に散布図を描画することができます。
チャートサイズ、色、透明度、線のサイズ、線の色などのデザインを変更可能で、マーカーの形も引数で指定することで変更可能です。
乱数を生成したサンプル数値で基本的な散布図を描画してみます。引数が x, y のみの場合、その他の引数(デザイン)はデフォルト値になります。
import numpy as np
import matplotlib.pyplot as plt
# プロットする乱数を生成
x = np.random.rand(75)
y = np.random.rand(75)
# figure,axesインスタンスを生成
fig = plt.figure(figsize=(6.4,4.8),dpi=100)
ax = fig.add_axes((.15,.15,.7,.7))
# 散布図を描画
ax.scatter(x, y)
plt.show()
scatterメソッドの主要な引数
Point&Figureを散布図を用いて描画する。
まずはマーカーを設定します。Point&Figureチャートなので、マーカーの形はプロット要素が「+(上昇)」の時は「×」、「-(下落)」の時は「○」となります。マーカーは引数指定なしのデフォルトだと「○」なので、下落時は以下のように「×」を指定します。(半角小文字)
plt.scatter(x, y, marker=“x”)
Point&Figureで「4枠上昇して3枠下落する」という形を描画してみます。
プロットのロジックは以下のようになります。
(1) X軸は1のまま、上昇枠の数(4回)だけY軸の値を加算
(2) 枠転換 =>> X軸に1加算
(3) 下落枠の数(3回)だけY軸の値を減算
マーカーサイズを500、それぞれ上昇枠、下落枠を○と×で描画するようにコードで記述してみました。
# 4枠上昇
for num in range(4):
x = 1
y = 1 + num
ax.scatter(x, y, s=500, marker="x")
# 枠転換して3枠下落
for num in range(3):
x = 1 + 1
y = 3 - num
ax.scatter(x, y, s=500)
Point&Figureチャートらしく散布図をカスタマイズ
X軸とY軸の範囲を指定し、マーカーの色や透明度を指定してもう少しPoint&Figureチャートらしく散布図をカスタマイズしてみます。
X軸とY軸は、それぞれ left, right, bottom, top の値を指定することで描画範囲を指定することができます。
ax.set_xlim(left=0, right=10)
ax.set_ylim(bottom=0, top=10)
マーカーは、alpha で透明度、c でマーカーの色、edgecolors でマーカーエッジの色を指定することができます。
import numpy as np
import matplotlib.pyplot as plt
# figure,axesインスタンスを生成
fig = plt.figure(figsize=(6.4,4.8),dpi=100)
ax = fig.add_axes((.15,.15,.7,.7))
# X軸とY軸の範囲を指定
ax.set_xlim(left=0, right=10)
ax.set_ylim(bottom=0, top=10)
# 散布図を描画
# 4枠上昇
for num in range(4):
x = 1
y = 3 + num
ax.scatter(x, y, s=500, linewidths=2,
c='#aaaaFF', marker="x")
# 枠転換して3枠下落
for num in range(3):
x = 2
y = 5 - num
ax.scatter(x, y, s=500, alpha=0.5, linewidths=2,
c='#FFaaaa', edgecolors='r')
# 枠転換して6枠上昇
for num in range(6):
x = 3
y = 4 + num
ax.scatter(x, y, s=500, linewidths=2,
c='#aaaaFF', marker="x")
# 枠転換して8枠下落
for num in range(8):
x = 4
y = 8 - num
ax.scatter(x, y, s=500, alpha=0.5, linewidths=2,
c='#FFaaaa', edgecolors='r')
plt.show()
とりあえず Point&Figure チャートっぽくなりました。(笑)
今後は上昇・下落枠及び枠転換の仕組みのモジュール化を考察しないといけませんね。