bitFlyer의 Echo API를 사용하여 Bitcoin의 실시간 속도를 시각화 (2)

소개



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

    실행 결과





    전회보다 상당히 좋은 느낌이 되었습니다.

    좋은 웹페이지 즐겨찾기