iBetter Books
수정

"차트 색이 좀 촌스럽지 않아요? 기본 색이 너무 원색이에요."

지윤이 불평했다.

"Plotly 기본 색상 팔레트가 있어. 그것도 여러 종류야. 그리고 원하는 색을 직접 지정할 수도 있고."

강주원 선배가 링크를 보내왔다. Plotly 색상 팔레트 목록이었다. D3, Plotly, Pastel, Dark24, Light24... 이름만 수십 개였다.

"이중에서 골라서 쓰면 돼. 데이터 시각화할 때 색이 너무 튀면 데이터보다 색에 집중하게 되거든. Pastel이나 Set2 계열이 발표용으로 무난해."


범주형 데이터의 색상 설정

범주형 변수(종류, 그룹 등)로 색을 구분할 때 color_discrete_sequence를 사용합니다.

# 파일: color_discrete.pyimport plotly.express as pxdf = px.data.iris()fig = px.scatter(    df,    x="sepal_width",    y="sepal_length",    color="species",    color_discrete_sequence=px.colors.qualitative.Pastel)fig.show()

실행 결과

실행하면 Pastel 팔레트가 적용된 붓꽃 산점도가 나타납니다. 부드러운 파스텔 색상으로 세 종이 구분됩니다.

px.colors.qualitative에는 범주형 데이터에 적합한 팔레트들이 있습니다.

팔레트 특징
Plotly Plotly 기본 팔레트 (선명한 색)
D3 D3.js 기본 팔레트 (데이터 시각화 표준)
Pastel 파스텔 톤 (부드러운 느낌)
Dark24 진한 색, 24가지
Light24 밝은 색, 24가지
Set2 Seaborn의 Set2와 유사

특정 색을 직접 지정하려면 색상 이름이나 hex 코드를 리스트로 넣습니다.

# 파일: color_custom.pyimport plotly.express as pxdf = px.data.iris()fig = px.scatter(    df,    x="sepal_width",    y="sepal_length",    color="species",    color_discrete_sequence=["#E74C3C", "#3498DB", "#2ECC71"])fig.show()

실행 결과

실행하면 hex 코드로 직접 지정한 빨강, 파랑, 초록 색상이 각 종에 적용된 산점도가 나타납니다.

특정 종에 특정 색을 매핑하려면 color_discrete_map 딕셔너리를 사용합니다.

# 파일: color_map.pyimport plotly.express as pxdf = px.data.iris()fig = px.scatter(    df,    x="sepal_width",    y="sepal_length",    color="species",    color_discrete_map={        "setosa": "#E74C3C",        "versicolor": "#3498DB",        "virginica": "#2ECC71"    })fig.show()

실행 결과

실행하면 각 종에 지정한 색이 정확히 매핑된 산점도가 나타납니다. setosa는 빨강, versicolor는 파랑, virginica는 초록으로 고정됩니다.

연속형 데이터의 색상 설정

연속형 변수(온도, 수치 등)로 색을 표현할 때 color_continuous_scale을 사용합니다.

# 파일: color_continuous.pyimport plotly.express as pxdf = px.data.iris()fig = px.scatter(    df,    x="sepal_width",    y="sepal_length",    color="petal_length",             # 연속형 변수    color_continuous_scale="Viridis"  # 색상 스케일)fig.show()

실행 결과

실행하면 꽃잎 길이(petal_length)에 따라 Viridis 색상 스케일로 점 색이 변하는 산점도가 나타납니다. 오른쪽에 컬러바가 표시되어 값의 범위를 확인할 수 있습니다.

자주 쓰는 연속형 색상 스케일입니다.

스케일 특징
Viridis 시각적으로 균일한 분포, 색맹 친화적
Plasma 보라에서 노란색으로
RdBu 파랑-흰색-빨강 (양방향 데이터)
Blues 흰색에서 파란색으로
Reds 흰색에서 빨간색으로
Hot 검정-빨강-노랑

마커 스타일 설정

마커의 크기, 모양, 테두리를 update_traces()로 조정합니다.

# 파일: marker_style.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.8,        line=dict(width=1.5, color="white")    ))fig.show()

실행 결과

마커 모양을 바꾸고 싶을 때는 symbol 속성을 사용합니다.

# 파일: marker_symbol.pyimport plotly.express as pxdf = px.data.iris()fig = px.scatter(    df,    x="sepal_width",    y="sepal_length",    color="species",    symbol="species"    # 종마다 다른 마커 모양)fig.update_traces(marker=dict(size=10))fig.show()

실행 결과

실행하면 색과 마커 모양이 동시에 다른 붓꽃 산점도가 나타납니다. 색각이상 사용자도 모양으로 세 종을 구분할 수 있어 접근성이 높아집니다.

symbol="species"는 범주형 변수로 마커 모양을 구분합니다. 색과 모양을 동시에 다르게 하면 색각이상인 독자도 구분할 수 있어서 접근성이 높아집니다.

자주 쓰는 마커 모양입니다.

모양
"circle" 원 (기본값)
"square" 사각형
"diamond" 마름모
"cross" 십자
"x" X자
"triangle-up" 위 삼각형
"star"

자주 묻는 질문

Q: 팔레트에 색이 몇 가지인지 확인하려면 어떻게 하나요?

px.colors.qualitative.Pastel은 리스트이므로 len(px.colors.qualitative.Pastel)로 확인할 수 있습니다. 데이터의 범주 수가 팔레트 색 수보다 많으면 색이 반복됩니다.

Q: opacity가 0이면 완전히 투명한가요?

맞습니다. opacity는 0(완전 투명)에서 1(완전 불투명) 사이의 값입니다. 겹치는 점이 많을 때 0.5~0.7 정도로 설정하면 밀도를 파악하는 데 도움이 됩니다.

Q: 마커 크기를 데이터 값에 따라 다르게 하려면 어떻게 하나요?

px.scatter()size 파라미터에 컬럼명을 전달합니다. size="pop"처럼 하면 pop 컬럼 값에 비례해서 마커 크기가 결정됩니다. 이것이 버블 차트입니다.