"차트 제목 바꾸고 싶은데 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_title과 yaxis_title은 xaxis=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()
marker에 line을 추가하면 마커 테두리가 생깁니다. 겹치는 점들이 많을 때 구분이 쉬워집니다.
특정 트레이스만 수정하기
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_title은 xaxis=dict(title=...) 의 단축형입니다.
Q: 모든 트레이스에 같은 설정을 적용하려면 어떻게 하나요?
selector 없이 update_traces()를 호출하면 모든 트레이스에 적용됩니다.
Q: add_hline()과 add_trace(go.Scatter(mode="lines", ...))의 차이는 뭔가요?
add_hline()은 선이 차트 전체 너비에 걸쳐 그려지고 범례에 나타나지 않습니다. add_trace()로 추가한 선은 데이터 기반이며 범례에 표시됩니다. 단순한 기준선은 add_hline()이 편하고, 범례에 표시하거나 특정 x 범위만 그리려면 add_trace()를 사용합니다.