본문 바로가기

코딩TIPS

[plotly] 이중 축, 2 axis 그래프 그리기

반응형

plotly의 그래프를 이중축으로 그려보겠습니다.

필요라이브러를 import 합니다.

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.express as px

plotly에서 기본 제공하는 stocks data를 불러옵니다.

df=px.data.stocks()
df.head(3)


AAPL(Apple)과 GOOG(Google) 데이터로 이중축 그래프를 그렸습니다.
make_subplots에서 secondary_y를 True로 설정합니다.
그 후 add_trace를 이용해서 각각의 그래프를 추가했습니다.

fig = make_subplots(specs=[[{"secondary_y":True}]])

fig.add_trace(
    go.Scatter(x=df['date'], y=df['AAPL'], name="Apple"),
    secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['GOOG'], name="Google"),
    secondary_y=True,
)

fig.show()

secondary_y=False는 좌측의 y축을 True는 우측의 y축을 사용합니다.


각 y축에 text를 넣어 확인해 보겠습니다.
secondary_y=False에 Apple을 True에 Google을 지정했습니다.

fig.update_yaxes(title_text="Apple", secondary_y=False, range=[0, 2])
fig.update_yaxes(title_text="Google", secondary_y=True, range=[0, 2])

전체 코드입니다.

fig = make_subplots(specs=[[{"secondary_y":True}]])

fig.add_trace(
    go.Scatter(x=df['date'], y=df['AAPL'], name="Apple"),
    secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['GOOG'], name="Google"),
    secondary_y=True,
)

fig.update_xaxes(title_text='date')

fig.update_yaxes(title_text="Apple", secondary_y=False)
fig.update_yaxes(title_text="Google", secondary_y=True)

fig.show()

좌측에 Apple, 우측에 Google text가 추가되었습니다.

 

반응형

 


다음으로는 각 y축의 max/min 값을 지정해보겠습니다.
fig.update_yaxes에 range에서 지정이 가능합니다.

fig = make_subplots(specs=[[{"secondary_y":True}]])

fig.add_trace(
    go.Scatter(x=df['date'], y=df['AAPL'], name="Apple"),
    secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['GOOG'], name="Google"),
    secondary_y=True,
)

fig.update_layout(
    title_text="2 axis example", 
)

fig.update_xaxes(title_text='date')

fig.update_yaxes(title_text="Apple", secondary_y=False, range=[0, 2])
fig.update_yaxes(title_text="Google", secondary_y=True, range=[0, 3])

fig.show()

좌측 y는 0~2, 우측은 0~3으로 범위가 지정이 되었습니다.


그래프의 제목은 위의 코드에 아래의 내용을 추가하면 됩니다.

fig.update_layout(
    title_text="2 axis example", 
)


마지막으로 subplot에 대해서 알아보겠습니다.
아래 회사가 6이니 이중축 그래프를 row방향으로 3개 추가해 보겠습니다.

전체 코드입니다.

fig = make_subplots(rows=2, cols=2,
                    specs=[[{"secondary_y": True}, {"secondary_y": True}],
                           [{"secondary_y": True}, {"secondary_y": True}]])

fig.add_trace(
    go.Scatter(x=df['date'], y=df['AAPL'], name="Apple"),
    secondary_y=False,row=1, col=1,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['GOOG'], name="Google"),
    secondary_y=True,row=1, col=1,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['AMZN'], name="Amazon"),
    secondary_y=False,row=1, col=2,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['FB'], name="Meta"),
    secondary_y=True,row=1, col=2,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['NFLX'], name="Netflix"),
    secondary_y=False,row=2, col=1,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['MSFT'], name="Microsoft"),
    secondary_y=True,row=2, col=1,
)

fig.show()

 

반응형

 

 

subplot을 row방향으로 2개 column방향으로 2개 만들었습니다.

fig = make_subplots(rows=2, cols=2,
                    specs=[[{"secondary_y": True}, {"secondary_y": True}],
                           [{"secondary_y": True}, {"secondary_y": True}]])


secondary_y=False와 True의 2개씩 row, col을 지정했습니다.
Apple, Google의 경우에는 row=1, col=1을 지정했습니다.

fig.add_trace(
    go.Scatter(x=df['date'], y=df['AAPL'], name="Apple"),
    secondary_y=False,row=1, col=1,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['GOOG'], name="Google"),
    secondary_y=True,row=1, col=1,
)

나머지도 동일한 방식으로 row, col을 지정합니다.

fig.add_trace(
    go.Scatter(x=df['date'], y=df['AMZN'], name="Amazon"),
    secondary_y=False,row=1, col=2,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['FB'], name="Meta"),
    secondary_y=True,row=1, col=2,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['NFLX'], name="Netflix"),
    secondary_y=False,row=2, col=1,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['MSFT'], name="Microsoft"),
    secondary_y=True,row=2, col=1,
)


최종 그래프입니다.

아래의 코드에 row, col을 지정해서 y축의 text 및 range의 사용이 가능합니다.

fig.update_yaxes(title_text="Apple", secondary_y=False, 
                 range=[0, 2], row=1,col=1)
fig.update_yaxes(title_text="Google", secondary_y=True, 
                 range=[0, 2], row=1,col=1)

 


위 그래프의 전체 코드입니다.

fig = make_subplots(rows=2, cols=2,
                    specs=[[{"secondary_y": True}, {"secondary_y": True}],
                           [{"secondary_y": True}, {"secondary_y": True}]])

fig.add_trace(
    go.Scatter(x=df['date'], y=df['AAPL'], name="Apple"),
    secondary_y=False,row=1, col=1,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['GOOG'], name="Google"),
    secondary_y=True,row=1, col=1,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['AMZN'], name="Amazon"),
    secondary_y=False,row=1, col=2,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['FB'], name="Meta"),
    secondary_y=True,row=1, col=2,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['NFLX'], name="Netflix"),
    secondary_y=False,row=2, col=1,
)

fig.add_trace(
    go.Scatter(x=df['date'], y=df['MSFT'], name="Microsoft"),
    secondary_y=True,row=2, col=1,
)

fig.update_yaxes(title_text="Apple", secondary_y=False, 
                 range=[0, 2], row=1,col=1)
fig.update_yaxes(title_text="Google", secondary_y=True, 
                 range=[0, 2], row=1,col=1)
fig.update_yaxes(title_text="Amazon", secondary_y=False, 
                 range=[0, 2], row=1,col=2)
fig.update_yaxes(title_text="Meta", secondary_y=True, 
                 range=[0, 2], row=1,col=2)
fig.update_yaxes(title_text="Netflix", secondary_y=False, 
                 range=[0, 2], row=2,col=1)
fig.update_yaxes(title_text="Microsoft", secondary_y=True, 
                 range=[0, 2], row=2,col=1)

fig.update_xaxes(title_text='date')

fig.update_layout(title_text='2axis subplot example')

fig.show()


이상으로 plotly의 그래프를 이중축으로 만들어봤습니다.

반응형