plotly로 그린 graph를 기존 웹 앱에 구현해 보았습니다.

10208 단어 plotlyFlask

개요


  • Dash plotly를 기존 웹 응용 프로그램에 통합하는 방법을 모르고 사고 8 고통을 겪었습니다
  • 그런 가운데, plotly.js의 존재를 알고, 「js사이드에서 plotly 호출해 사용하면 좋겠다」가 되어, flask의 tutorial와 plotly.js를 조합해 사용해 보았습니다.
  • 기존의 web application에 짜넣는 것은, simple에 데이터를 클라이언트측에 보내, js에 렌더링 시키는 것이 제일 즐거운 것 같다고 생각했습니다.

  • 이하, flask로 작성한 web application에 sample graph를 렌더링 하는 코드를 소개하겠습니다.

    (Plotly Dash도 따로 짜넣을 수 있어, 등의 유식자의 의견 기다리고 있습니다.)

    코드



    server측에서 데이터를 송신하는 함수를 준비한다.
    @bp.route("/get_sample_data", methods=("GET",))
    def get_sample_data():
        # import pdb; pdb.set_trace()
        out = {"y": [0, 14, 3, 17]}
        return out
    

    index.html
    <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
    
    ...中略...
    
    {% block graphs %}
    
    
    <button id="get_data_button"></button>
    <div hidden class="result"></div>
    
    <!-- 1. plotly.jsの内容を`#graphDiv`の要素にレンダリングする。 -->
    <div id="graphDiv" class="graph">Plotly test</div>
    
    <script>
      var data = [{
      x: [1999, 2000, 2001, 2002],
      y: [10, 15, 13, 17],
      type: 'scatter'
    }];
    //ボタンが押されたらAJAXで非同期通信を実行し、サーバサイドからデータを取得する。
      $(function(){
        $("#get_data_button").on("click", function(){
          $.ajax({
            url:'/get_sample_data',
            type:'GET',
          })
          .done((res) => {
            $('.result').html(res);
            console.log(res);
              data.push({
              x: [1999, 2000, 2001, 2002],
              y: res.y, // res == {"y": [0, 14, 3, 17]} in get_sample_data function in blog.py
              type: 'scatter'
              });
              Plotly.newPlot(graphDiv, data, layout);
          }) // check arrow function
        }).fail((res) => {
          $('.result').html(res);
            console.log(res);
        })
      }
      )
      var graphDiv = document.getElementById('graphDiv')
    
    var layout = {
      height: 500,
      title: 'Sales Growth',
      xaxis: {
        title: 'Year',
        showgrid: false,
        zeroline: false
      },
      yaxis: {
        title: 'Percent',
        showline: false
      }
    };
    Plotly.newPlot(graphDiv, data, layout);
    </script>
    
    {% endblock %}
    


    거꾸로 해설



    하나하나 분해해 설명합니다(수시 갱신 예정)
  • plotly.js의 내용을 #graphDiv의 요소로 렌더링합니다.
  • #get_data_buttonid 로 하는 <button> 를 누르면, flask application 에 AJAX 로 GET 통신으로부터 get_sample_data() 를 실행해 데이터를 돌려준다.
  • 데이터를 검색하고 data list로 push(res) 한 다음 Plotly.newPlot(graphDiv, data, layout);를 다시 실행합니다.
  • y = [0, 14, 3, 17]의 시계열 데이터가 추가되었는지 확인합니다. (아래 이미지 오렌지색 직선)

  • tutorial로 막힌 곳,


  • Plotly.js에서는 rendering 대상을 <div> 태그로 하지 않으면 읽어주지 않는 것 같습니다. ( 를 사용해도 platly.js가 그려주지 않습니다. )

  • 출력되는 그래프의 CSS에 관하여
  • #graphDiv 에 관해서 사이즈를 변경하도록(듯이) 코딩했지만 전혀 사이즈 변경되지 않고, 매우 곤란했다.
  • Plotly.newPlot(graphDiv, data, layout);에서 layout에 height, width 키를 추가해 주면 OK였습니다.
  • (단순히 CSS 지식이 부족하다고 생각했습니다 ...)


  • 참고문헌


  • Plotly.js 샘플 코드
  • 좋은 웹페이지 즐겨찾기