見出し画像

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()

画像1

scatterメソッドの主要な引数

画像3

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)

画像3

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()

画像4

とりあえず Point&Figure チャートっぽくなりました。(笑)
今後は上昇・下落枠及び枠転換の仕組みのモジュール化を考察しないといけませんね。

いいなと思ったら応援しよう!