iBetter Books
수정

"차트 제목 바꾸고 싶은데 Express 파라미터에서는 못 찾겠어요."

지윤이 메시지를 보냈다.

"title 파라미터 있잖아. px.scatter(... title='제목') 이렇게."

"그건 알겠는데, 폰트 크기랑 색도 바꾸고 싶어요."

"아, 그건 update_layout 써야 해. 이제 진짜 Graph Objects 세계에 들어온 거야."


update_layout

fig.update_layout()은 Figure의 layout 영역을 수정합니다. 제목, 축, 범례, 배경색, 크기 등 차트 전체에 적용되는 설정을 바꿀 수 있습니다.

# 파일: update_layout_basic.pyimport plotly.express as pxdf = px.data.iris()fig = px.scatter(    df,    x="sepal_width",    y="sepal_length",    color="species")fig.update_layout(    title=dict(        text="붓꽃 산점도",        font=dict(size=20, color="darkblue")    ),    xaxis_title="꽃받침 너비 (cm)",    yaxis_title="꽃받침 길이 (cm)",    width=800,    height=500)fig.show()

실행 결과

xaxis_titleyaxis_titlexaxis=dict(title=...) 의 단축 표기법입니다. Plotly는 이렇게 중첩된 속성을 _로 연결해서 쓸 수 있습니다.

update_traces

fig.update_traces()는 Figure의 data 영역, 즉 트레이스를 수정합니다. 마커 크기, 선 굵기, 투명도 등 데이터 표현 방식을 바꿀 때 사용합니다.

# 파일: update_traces_basic.pyimport plotly.express as pxdf = px.data.iris()fig = px.scatter(    df,    x="sepal_width",    y="sepal_length",    color="species")fig.update_traces(    marker=dict(size=10, opacity=0.7, line=dict(width=1, color="white")))fig.show()

실행 결과

markerline을 추가하면 마커 테두리가 생깁니다. 겹치는 점들이 많을 때 구분이 쉬워집니다.

특정 트레이스만 수정하기

selector 파라미터로 특정 트레이스만 선택해서 수정할 수 있습니다.

# 파일: update_traces_selector.pyimport plotly.express as pxdf = px.data.iris()fig = px.scatter(    df,    x="sepal_width",    y="sepal_length",    color="species")# setosa 트레이스만 마커 크기를 크게fig.update_traces(    selector=dict(name="setosa"),    marker=dict(size=15, symbol="star"))fig.show()

실행 결과

실행하면 setosa 트레이스만 별 모양의 큰 마커로 표시됩니다. versicolor와 virginica는 기본 원형 마커를 유지합니다.

selector=dict(name="setosa")는 이름이 "setosa"인 트레이스만 선택합니다.

add_trace

새 트레이스를 추가할 때는 add_trace()를 사용합니다.

# 파일: add_trace_example.pyimport plotly.express as pximport plotly.graph_objects as goimport numpy as npdf = px.data.iris()fig = px.scatter(    df,    x="sepal_width",    y="sepal_length",    color="species",    opacity=0.5)# 평균 sepal_length를 나타내는 수평선 트레이스 추가mean_y = df["sepal_length"].mean()fig.add_trace(    go.Scatter(        x=[df["sepal_width"].min(), df["sepal_width"].max()],        y=[mean_y, mean_y],        mode="lines",        name=f"평균 ({mean_y:.2f})",        line=dict(color="black", dash="dash")    ))fig.show()

실행 결과

실행하면 산점도에 꽃받침 길이 평균값을 나타내는 검은 점선 기준선이 추가됩니다. 범례에 "평균 (5.84)" 형태로 표시되어 값을 바로 확인할 수 있습니다.

메서드 체이닝

update_layout()update_traces()는 Figure 객체를 반환하므로, 연이어 호출할 수 있습니다.

# 파일: method_chaining.pyimport plotly.express as pxdf = px.data.iris()fig = (    px.scatter(df, x="sepal_width", y="sepal_length", color="species")    .update_layout(        title="붓꽃 산점도",        xaxis_title="꽃받침 너비 (cm)",        yaxis_title="꽃받침 길이 (cm)"    )    .update_traces(        marker=dict(size=8, opacity=0.7)    ))fig.show()

실행 결과

실행하면 메서드 체이닝으로 한 번에 제목, 축 레이블, 마커 크기와 투명도가 적용된 붓꽃 산점도가 나타납니다.

한 번에 여러 수정을 적용할 때 코드가 깔끔해집니다.


자주 묻는 질문

Q: update_layout(xaxis_title="...")update_layout(xaxis=dict(title="...")) 은 같은 건가요?

같습니다. Plotly는 중첩 속성을 _로 연결하는 단축 표기를 지원합니다. xaxis_titlexaxis=dict(title=...) 의 단축형입니다.

Q: 모든 트레이스에 같은 설정을 적용하려면 어떻게 하나요?

selector 없이 update_traces()를 호출하면 모든 트레이스에 적용됩니다.

Q: add_hline()add_trace(go.Scatter(mode="lines", ...))의 차이는 뭔가요?

add_hline()은 선이 차트 전체 너비에 걸쳐 그려지고 범례에 나타나지 않습니다. add_trace()로 추가한 선은 데이터 기반이며 범례에 표시됩니다. 단순한 기준선은 add_hline()이 편하고, 범례에 표시하거나 특정 x 범위만 그리려면 add_trace()를 사용합니다.