LoginSignup
2

More than 5 years have passed since last update.

bitFlyerのEcho APIを使ってBitcoinのリアルタイムレートを可視化(2)

Last updated at Posted at 2017-12-20

はじめに

bitFlyerのEcho APIを使ってBitcoinのリアルタイムレートを可視化(1)の続きです。

前回からの変更点

  • レートの最大値、最小値を表示
  • 見た目を少しオシャレにしてみる
  • 0.5秒毎にデータを取得
  • 1分間のレートを表示

プログラム

main.py
import requests
import json
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.font_manager import FontProperties
import matplotlib as mpl
from datetime import datetime

# エンドポイント
end_point = 'https://bitflyer.jp/api/echo/price'

# 表示するテキストフォーマット
rate_text = '仲値\nMax : {}\nMin : {}\n\n買取価格\nMax : {}\nMin : {}\n\n販売価格\nMax : {}\nMin : {}'

# APIからデータ取得
response = requests.get(end_point)
rate = json.loads(response.text)

# 日本語を表示するためにフォントを設定
fp = FontProperties(fname='ipaexg.ttf', size=15)

# 各データを初期化
time_axis = [datetime.now() for _ in range(60)]
mid = [rate['mid'] for _ in range(60)]
bid = [rate['bid'] for _ in range(60)]
ask = [rate['ask'] for _ in range(60)]
max_mid = max(mid)
min_mid = min(mid)
max_bid = max(bid)
min_bid = min(bid)
max_ask = max(ask)
min_ask = min(ask)

# ウィンドウを描画
mpl.rcParams['toolbar'] = 'None'
fig = plt.figure(figsize=(18,10), facecolor='#1B2027')
axes = plt.axes(axisbg='black', alpha=0.2)
axes_pos = axes.get_position()
plt.grid(color='#232323')
plt.tick_params(axis='x', colors='#ADADAD')
plt.tick_params(axis='y', colors='#ADADAD')

# コールバック関数
def plot(loop_count):
    global max_mid
    global min_mid
    global max_bid
    global min_bid
    global max_ask
    global min_ask

    # グラフをリフレッシュ
    plt.cla()
    fig.clf()
    axes = plt.axes(axisbg='black', alpha=0.2)
    axes_pos = axes.get_position()
    plt.grid(color='#232323')
    plt.tick_params(axis='x', colors='#ADADAD')
    plt.tick_params(axis='y', colors='#ADADAD')
    plt.grid(color='#232323')

    # APIからデータ取得
    response = requests.get(end_point)
    rate = json.loads(response.text)

    # 配列の先頭を削除
    time_axis.pop(0)
    mid.pop(0)
    bid.pop(0)
    ask.pop(0)

    # 配列の最後にデータを追加
    time_axis.append(datetime.now())
    mid.append(rate['mid'])
    bid.append(rate['bid'])
    ask.append(rate['ask'])

    # 最大値、最小値の更新
    max_mid = max(mid) if max_mid < max(mid) else max_mid
    min_mid = min(mid) if min_mid > min(mid) else min_mid
    max_bid = max(bid) if max_bid < max(bid) else max_bid
    min_bid = min(bid) if min_bid > min(bid) else min_bid
    max_ask = max(ask) if max_ask < max(ask) else max_ask
    min_ask = min(ask) if min_ask > min(ask) else min_ask

    # プロット
    plt.plot(time_axis, mid, label='仲値')
    plt.plot(time_axis, bid, label='買取価格')
    plt.plot(time_axis, ask, label='販売価格')
    fig.text(axes_pos.x1 + 0.05, axes_pos.y1 - 0.5, rate_text.format(max_mid, min_mid, max_bid, min_bid, max_ask, min_ask), fontproperties=fp, color='w', fontsize=15)

    # ラベル配置
    leg = plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1), borderaxespad=0, prop=fp, facecolor='#1B2027', edgecolor='#ED6751')
    [leg_text.set_color('white') for leg_text in leg.get_texts()]
    plt.subplots_adjust(right=0.8)

# 500ms(0.5s)でアニメーションを更新
ani = FuncAnimation(fig, plot, interval=500)

# 描画
plt.show()

実行結果

ezgif-4-c494e99ec0.gif

前回よりだいぶいい感じになりました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2