Pythonで「Point & Figure」チャートを描画する。(1)
「Pythonista3」でP&Fチャート(ポイント&フィギュア)の描画に挑戦してみようと思います。
参考にしたのは以下のサイトです。
参考サイトのコードからPythonを勉強しながらチャート描画までの試行錯誤を記録していきます。
新規Scriptファイルの作成
Pythonista3 を起動して、Scriptファイルを新規作成します。
Script with UIという項目を選択し、UIファイルとそれを利用するScriptファイルをセットで作成します。Scriptファイル名は「PFChart」として作成しました。
新規Scriptファイルの内容
ファイルを作成すると「PFChart.py」と「PFChart.pyui」という2つのファイルが作成されます。
Scriptファイル作成時に自動的に記述されているコードを見てみます。
import ui
v = ui.load_view()
v.present(‘Sheet’)
(1)「UI」モジュールをインポート
ユーザーインターフェースの部品は全て「UI」モジュールに格納されているので、まずこれをインポートしておく必要があります。
(2)「pyui」ファイルをロード
引数にファイル名を指定して「UI」ファイルをロードします。引数を省略した場合、Scriptファイルと同じ名前の「pyui」ファイルがロードされます。
ロードされたデータは、変数「v」にViewクラスのインスタンスとして返されます。
(3)View インスタンスを画面に表示
引数に表示するViewインスタンスのスタイルを指定します。
‘Sheet’ は、一般的なアプリとして表示するスタイルです。スタイルには他に ’full_screen’ (フルスクリーン)や ‘sidebar’ (サイドバー)などがあります。
Matplotlibとは?
Scriptファイル作成後、コードを書いていくのですが、まず、Pythonでチャートを描画するためのライブラリ「matplotlib」をインポートする必要があります。matplotlibは、Pythonでグラフを描画したり、チャートイメージを表示させるためのモジュールで、様々なグラフを描画するための標準的なライブラリです。オープンソースで公開されており、個人/商用を問わず、無料で利用することができます。
線グラフ、棒グラフ、3Dグラフなどを描画することができ、数値計算ライブラリであるNumPyと組み合わせて利用する場合が多くなります。
Pythonista3に「matplotlib」はデフォルトでインストールされています。インタラクティブコンソールでインストールされている「matplotlib」のバージョンを確認することができます。
画面右端から内側に向かってゆっくりスワイプしてコンソール画面を引き出して入力フィールドに次のコマンドを入力します。
import matplotlib as mpl
mpl.__version__
インストールされている「Matplotlib」のデフォルトバージョンは” 1.4.0 “ でした。最新のバージョンが “ 3.3.0 “なので相当古いですが、、、
コードを実行してみる・・・
とりあえず参考にしたサイトのコードを何も考えずに書いてみることにします。さて、Pythonista3 で動くのか・・・?
import matplotlib.pyplot as plt
BOX = 5
START = 365
changes = (8, -3, 4, -4, 12, -3, 7, -3, 5, -9, 3)
# one way to force dimensions is to set the figure size:
fig = plt.figure(figsize=(5, 10))
# another way is to control the axes dimensions
# for axes to have specific dimensions:
# [ x0, y0, w, h] in figure units, from 0 to 1
# ax = fig.add_axes([.15, .15, .7*.5, .7])
ax = fig.add_axes([.15, .15, .7, .7])
def sign(val):
return val/abs(val)
pointChanges = []
for chg in changes:
pointChanges += [sign(chg)] * abs(chg)
symbol = {-1:'o',
1:'x'}
chgStart = START
for ichg, chg in enumerate(changes):
x = [ichg+1] * abs(chg)
y = [chgStart + i * BOX * sign(chg) for i in range(abs(chg))]
chgStart += BOX * sign(chg) * (abs(chg)-2)
ax.scatter(x, y,
marker=symbol[sign(chg)],
s=175) #<----- control size of scatter symbol
ax.set_xlim(0, len(changes)+1)
fig.savefig('pointandfigure.png')
plt.show()
やはり、、、エラーが表示されて動きません。
Pythonista3のデバック方法もまだ分からないので、1行ずつ勉強しながらコードを修正していきます。。。
色々と調べながら書いているから時間かかります。。。
次回は、matplotlibを使って、まずはグラフ画面が表示できるようにコードを修正します。