본문 바로가기

개발하자

주피터의 플롯 도형 업데이트 [수초마다]

반응형

주피터의 플롯 도형 업데이트 [수초마다]

나는 플롯풀한 파이썬 패키지를 처음 접하며 다음과 같은 문제에 직면했다. 루프에서 업데이트되고 있는 판다 데이터 프레임이 있는데 저는 플롯으로 데이터를 그려야 합니다. 처음에는 모든 값이 그랬다가 채워지기 시작합니다. 다음은 한 가지 예입니다. 나는 플롯으로 이 변화에 대응하고 싶지만, 가장 "정통적이고" 간단한 방법으로 어떻게 해야 할지 모르겠다. (데이터 업데이트 루프와 플롯으로 업데이트되는 것이 동시에 작동한다면 좋을 것이지만, 플롯으로 인해 몇 초마다 반응이 일어난다면 괜찮을 것이다.) 몇 가지 기능을 찾았지만 정확히 어떻게 작동하는지 이해하지 못합니다.

import plotly.graph_objects as go
import cufflinks as cf
from plotly.offline import init_notebook_mode

init_notebook_mode(connected=True)
cf.go_offline()

fig = go.Figure(data=go.Heatmap(z=df.response,
                                x=df.currents,
                                y=df.frequencies))

fig.update_layout(datarevision=???) # This one

...



  • 데이터 도착 시 업데이트하려는 경우 이벤트/인터럽트 처리 접근 방식이 필요합니다.
  • 이 예에서는 시간을 이벤트/인터럽트로 사용합니다.
  • 추가 데이터를 데이터 프레임에 연결하여 더 많은 데이터를 시뮬레이션한 다음 에서 업데이트한다.
import plotly.graph_objects as go
import numpy as np
import pandas as pd
from jupyter_dash import JupyterDash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State

# initialise dataframe and figure
df = pd.DataFrame({"response":[], "currents":[], "frequencies":[]})
fig = go.Figure(data=go.Heatmap(z=df.response,
                                x=df.currents,
                                y=df.frequencies))



# Build App
app = JupyterDash(__name__)
app.layout = html.Div(
    [
        dcc.Graph(id="heatmap", figure=fig),
        dcc.Interval(id="animateInterval", interval=400, n_intervals=0),
    ],
)

@app.callback(
    Output("heatmap", "figure"),
    Input("animateInterval", "n_intervals"),
    State("heatmap", "figure")
)
def doUpdate(i, fig):
    global df
    df = pd.concat([df, pd.DataFrame({"response":np.random.uniform(1,5,100), "currents":np.random.randint(1,20,100), "frequencies":np.random.randint(1,50,100)})])

    return go.Figure(fig).update_traces(go.Heatmap(z=df.response,
                                x=df.currents,
                                y=df.frequencies))


# Run app and display result inline in the notebook
app.run_server(mode="inline")



나는 Rob Raymond보다 덜 복잡한 해결책을 가지고 있다고 믿는다. 나는 개인적으로 이것을 원한다. 기본적으로 내부만 감싸면 됩니다. 모든 데이터 변경 사항에 자동으로 응답합니다.

그러나 나는 (주피터 노트북에서) 플로틀리보다 대시를 단독으로 사용하는 것의 이점이 있는지 알고 싶다.


반응형