iBetter Books
수정

컬러 팔레트 선택 가이드

색상은 단순히 차트를 예쁘게 만드는 장식이 아닙니다. 색상은 데이터의 의미를 전달하는 도구입니다.

강주원 선배가 민서에게 물었습니다. "민서야, 지금 사용하는 파란색 팔레트, 이게 뭘 나타내려는 거야?"

"그냥... 예쁘니까요?"

"그게 문제야. 색에는 세 가지 유형이 있어. 데이터의 성격에 맞는 유형을 골라야 해."


3가지 팔레트 유형

범주형 팔레트: 그룹을 구분할 때

범주형 데이터는 순서나 크기 관계가 없는 독립적인 그룹입니다. 종류(species), 성별(sex), 요일(day) 같은 변수가 여기 해당합니다.

범주형 팔레트는 색들이 비슷한 밝기와 채도를 가지면서 서로 뚜렷하게 구분되어야 합니다. 어떤 색도 다른 색보다 더 중요하거나 덜 중요하게 보이면 안 됩니다.

# 파일: palette_qualitative.pyimport seaborn as snsimport matplotlib.pyplot as plt# 주요 범주형 팔레트 미리보기palettes = ["deep", "muted", "pastel", "bright", "dark", "colorblind", "Set2", "tab10"]fig, axes = plt.subplots(len(palettes), 1, figsize=(10, len(palettes) * 0.8))for ax, name in zip(axes, palettes):    palette = sns.color_palette(name, n_colors=8)    ax.imshow([palette], aspect="auto")    ax.axis("off")    ax.set_title(name, loc="left", fontsize=10)plt.suptitle("범주형 팔레트", y=1.02)plt.tight_layout()plt.show()

실행 결과

# 파일: palette_qualitative_usage.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins")# Set2: 인쇄에서도 구분 잘 되는 범주형 팔레트sns.scatterplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    hue="species",    palette="Set2")plt.title("팔레트: Set2")plt.show()

실행 결과

순차형 팔레트: 값의 크기를 표현할 때

순차형 데이터는 값이 작은 것에서 큰 것으로 이어지는 연속적인 의미를 가집니다. 히트맵, 밀도 차트, 값을 색으로 인코딩하는 산점도 등에 씁니다.

순차형 팔레트는 한쪽 끝에서 다른 끝으로 갈수록 밝기(lightness)가 단조롭게 변해야 합니다. 흑백 인쇄에서도 명암 차이로 구분이 가능해야 한다는 의미입니다.

# 파일: palette_sequential.pyimport seaborn as snsimport matplotlib.pyplot as pltimport numpy as np# 순차형 팔레트 미리보기seq_palettes = ["Blues", "viridis", "rocket", "mako", "flare", "crest"]fig, axes = plt.subplots(len(seq_palettes), 1, figsize=(10, len(seq_palettes) * 0.8))for ax, name in zip(axes, seq_palettes):    palette = sns.color_palette(name, n_colors=10, as_cmap=False)    ax.imshow([palette], aspect="auto")    ax.axis("off")    ax.set_title(name, loc="left", fontsize=10)plt.suptitle("순차형 팔레트", y=1.02)plt.tight_layout()plt.show()

실행 결과

# 파일: palette_sequential_usage.pyimport seaborn as snsimport matplotlib.pyplot as pltimport numpy as np# 히트맵에 순차형 팔레트 적용flights = sns.load_dataset("flights")flights_pivot = flights.pivot(index="month", columns="year", values="passengers")sns.heatmap(flights_pivot, cmap="rocket")plt.title("월별·연도별 항공 승객 수 (팔레트: rocket)")plt.show()

실행 결과

발산형 팔레트: 기준점 기준 양방향 표현

발산형 데이터는 중간 기준점(보통 0 또는 평균)을 중심으로 양방향으로 뻗어 나가는 의미를 가집니다. 상관계수 히트맵, 편차 차트 등에 씁니다.

발산형 팔레트는 중앙이 밝고(또는 중립적이고), 양 끝으로 갈수록 서로 다른 두 색이 짙어지는 구조입니다.

# 파일: palette_diverging.pyimport seaborn as snsimport matplotlib.pyplot as plt# 발산형 팔레트 미리보기div_palettes = ["coolwarm", "RdBu", "icefire", "vlag", "RdYlBu"]fig, axes = plt.subplots(len(div_palettes), 1, figsize=(10, len(div_palettes) * 0.8))for ax, name in zip(axes, div_palettes):    palette = sns.color_palette(name, n_colors=10)    ax.imshow([palette], aspect="auto")    ax.axis("off")    ax.set_title(name, loc="left", fontsize=10)plt.suptitle("발산형 팔레트", y=1.02)plt.tight_layout()plt.show()

실행 결과

# 파일: palette_diverging_usage.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins").dropna()# 상관계수 히트맵에 발산형 팔레트 적용corr = penguins[["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]].corr()sns.heatmap(    corr,    cmap="coolwarm",    center=0,          # 0이 중앙 기준    annot=True,        # 숫자 표시    fmt=".2f",    vmin=-1, vmax=1    # 색 범위 고정)plt.title("변수 간 상관계수 (팔레트: coolwarm)")plt.show()

실행 결과


color_palette() 함수 사용법

# 파일: color_palette_usage.pyimport seaborn as snsimport matplotlib.pyplot as plt# 팔레트 생성: n_colors로 색 개수 지정palette = sns.color_palette("Set2", n_colors=5)print(type(palette))       # <class 'seaborn.palettes._ColorPalette'>print(palette[:2])         # 첫 두 색의 RGB 튜플# 팔레트 미리보기sns.palplot(palette)plt.title("Set2 팔레트 (5색)")plt.show()

실행 결과

color_palette()가 반환하는 객체는 리스트처럼 인덱싱하거나 반복할 수 있습니다.


색맹 친화 팔레트

발표 청중 중 약 8%(남성 기준)는 적록색맹이나 다른 형태의 색각 이상을 가지고 있습니다. 색맹 사용자도 구분할 수 있는 팔레트를 선택하는 것은 데이터 시각화의 기본 접근성 요건입니다.

colorblind 팔레트

Seaborn의 colorblind 팔레트는 색각 이상을 가진 사람도 구분할 수 있도록 설계된 팔레트입니다.

# 파일: colorblind_palette.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins")# colorblind 팔레트 적용sns.set_theme(palette="colorblind")sns.scatterplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    hue="species",    style="species"    # 색 외에 마커 모양도 다르게)plt.title("색맹 친화 팔레트 + 마커 모양 구분")plt.show()

실행 결과

style="species"를 함께 사용한 것이 중요합니다. 색만으로 구분하면 색맹 사용자에게 한계가 있습니다. 마커 모양이나 선 스타일을 함께 다르게 하면 색각 이상 여부와 무관하게 그룹을 구분할 수 있습니다.

왜 colorblind 팔레트가 중요한가

일반적인 red-green 기반 팔레트는 적록색맹 사용자에게는 두 색이 거의 같아 보입니다. colorblind 팔레트는 파랑, 주황, 초록의 조합을 기본으로 하며, 이 세 색은 대부분의 색각 이상 유형에서도 서로 다르게 보입니다.

# 파일: colorblind_vs_default.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))# 기본 팔레트 (색맹 비친화적)sns.boxplot(    data=tips,    x="day",    y="total_bill",    hue="sex",    palette="deep",    ax=ax1)ax1.set_title("deep 팔레트 (색맹 비주의)")# colorblind 팔레트sns.boxplot(    data=tips,    x="day",    y="total_bill",    hue="sex",    palette="colorblind",    ax=ax2)ax2.set_title("colorblind 팔레트 (접근성 고려)")plt.tight_layout()plt.show()

실행 결과


접근성 체크 방법

차트를 저장한 후 접근성을 확인하는 실용적인 방법입니다.

흑백으로 변환해서 확인하기

흑백 인쇄에서도 차트가 구분 가능한지 확인합니다. viridisrocket 같은 밝기 기반 팔레트는 흑백에서도 구분이 잘 됩니다.

# 파일: accessibility_check.pyimport seaborn as snsimport matplotlib.pyplot as pltfrom matplotlib import cmpenguins = sns.load_dataset("penguins")fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))# 컬러 버전sns.scatterplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    hue="species",    palette="colorblind",    ax=ax1)ax1.set_title("컬러 버전")# 흑백 변환: 마커 크기와 스타일로 구분sns.scatterplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    hue="species",    style="species",    palette=["#333333", "#777777", "#bbbbbb"],  # 명도 차이로 구분    ax=ax2)ax2.set_title("흑백 인쇄 버전")plt.tight_layout()plt.show()

실행 결과

팔레트 선택 기준 요약

# 파일: palette_decision.pyimport seaborn as snsimport matplotlib.pyplot as plt# 데이터 유형에 따른 팔레트 선택 가이드decision_guide = {    "범주형 (순서 없음)": ["colorblind", "Set2", "tab10"],    "순차형 (낮음→높음)": ["viridis", "rocket", "Blues"],    "발산형 (기준점 중심)": ["coolwarm", "RdBu", "icefire"],    "브랜드/커스텀": ["직접 지정 (다음 절 참고)"]}for dtype, palettes in decision_guide.items():    print(f"[{dtype}]")    for p in palettes:        print(f"  - {p}")    print()

민서의 정리

"색을 고를 때 기준이 생겼어요. 종류를 나눌 때는 범주형, 값의 크기를 보여줄 때는 순차형, 기준점 대비 양방향을 보여줄 때는 발산형. 그리고 항상 색맹 팔레트를 먼저 고려하고, 마커 모양도 같이 다르게 하는 게 기본이고요."

"정확해. 그리고 흑백 인쇄에서도 구분이 되는지 확인하는 습관을 들여. 논문이나 보고서는 흑백으로 인쇄하는 경우가 많거든."