그림의 일관된 외형은 세 계층으로 관리합니다. 스타일시트(plt.style.use(...))로 전체 톤을 한 번에 바꾸고, rcParams로 개별 기본값(폰트 크기, 선 굵기 등)을 조정하며, 각 플롯 호출에서 색을 직접 지정합니다.
색을 값에 매핑할 때는 컬러맵(colormap)을 쓰며, 데이터 성격에 따라 순차형(viridis)·발산형(coolwarm)·범주형(tab10)을 구분해 골라야 합니다.
연속값→색 변환은 Normalize가 담당하고, 그 대응표를 colorbar로 보여줍니다.
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as npplt.style.useprint(plt.style.available) # 사용 가능한 스타일 목록
plt.style.use("seaborn-v0_8") # 예: seaborn 계열 톤 (버전에 따라 이름 다름)
plt.style.use("ggplot")
plt.style.use("default") # 초기화
with plt.style.context("dark_background"): # 이 블록에서만 적용
fig, ax = plt.subplots()
ax.plot(np.arange(10))plt.style.use(["seaborn-v0_8", {"figure.dpi": 120}]).seaborn-v0_8-* 형태입니다(구버전 seaborn-*은 제거됨).💡 이럴 때: 발표용·논문용·다크모드용 설정을 각각
.mplstyle파일로 저장해 두고plt.style.use("mystyle.mplstyle")로 전환하면 그림마다 손볼 필요가 없습니다.
rcParams -개별 기본값mpl.rcParams["figure.figsize"] = (7, 4.5)
mpl.rcParams["font.size"] = 11
mpl.rcParams["axes.grid"] = True
mpl.rcParams["axes.prop_cycle"] = mpl.cycler(color=["#4C72B0", "#DD8452", "#55A868"])
with mpl.rc_context({"lines.linewidth": 3}): # 임시 변경
...
mpl.rcdefaults() # 전체 초기화rcParams는 딕셔너리처럼 동작하는 전역 설정입니다. 스타일시트도 결국 rcParams를 바꾸는 것입니다.axes.prop_cycle은 color= 없이 여러 번 plot했을 때 자동으로 도는 색 목록입니다. "C0", "C1"은 이 순환의 0번, 1번 색을 뜻합니다.matplotlib이 받아들이는 색 표현은 여러 가지입니다.
ax.plot(x, y, color="#4C72B0")
ax.plot(x, y2, color="C1", alpha=0.6)컬러맵은 스칼라 값 → 색의 함수입니다. 데이터 성격에 맞춰 골라야 오해가 없습니다.
# 순차형: 산점도의 세 번째 변수
sc = ax.scatter(x, y, c=z, cmap="viridis")
fig.colorbar(sc, ax=ax, label="z")
# 발산형: 상관 행렬 히트맵
im = ax.imshow(corr, cmap="coolwarm", vmin=-1, vmax=1)
fig.colorbar(im, ax=ax)
# 범주형: 그룹별 색을 직접 뽑아 쓰기
cmap = plt.get_cmap("tab10")
for i, (name, g) in enumerate(groups.items()):
ax.plot(g["x"], g["y"], color=cmap(i), label=name)💡 이럴 때: 무지개(
jet) 컬러맵은 명도가 들쭉날쭉해 실제 없는 경계를 만들고 흑백 인쇄·색맹에서 무너집니다. 크기 데이터는viridis계열을 기본으로 씁니다.
💡 이럴 때: 상관계수·증감률처럼 0을 기준으로 부호가 갈리는 값은 발산형(coolwarm)에 vmin=-max, vmax=+max로 중심을 0에 맞춥니다. 안 그러면 0이 중립색에 오지 않아 왜곡됩니다.
Normalize와 colorbar연속값을 컬러맵에 넘기기 전, 어떤 값 범위를 [0, 1]로 볼지 정하는 것이 Normalize입니다.
import matplotlib.colors as mcolors
norm = mcolors.Normalize(vmin=0, vmax=100) # 선형
# norm = mcolors.LogNorm(vmin=1, vmax=1e4) # 로그(값이 여러 자릿수)
# norm = mcolors.TwoSlopeNorm(vcenter=0, vmin=-5, vmax=20) # 0을 중심으로 비대칭 발산
sc = ax.scatter(x, y, c=z, cmap="viridis", norm=norm)
cbar = fig.colorbar(sc, ax=ax, label="score")
cbar.set_ticks([0, 25, 50, 75, 100])vmin/vmax를 고정하면 여러 그림의 색 기준이 통일되어 비교가 가능합니다(고정 안 하면 그림마다 자동 범위가 달라짐).colorbar는 scatter/imshow가 반환한 매핑 객체(ScalarMappable)를 받아 색↔값 눈금자를 그립니다.fig.colorbar(sc, ax=axes.ravel().tolist())로 하나만 그립니다.💡 이럴 때: 시점별로 여러 히트맵을 나열해 변화를 보여줄 때는 모든 그림에 같은
vmin/vmax를 줘야 색이 같은 값을 뜻합니다.
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.