matplotlib 실무의 90%는 다섯 가지 메서드로 해결됩니다. ax.plot(선), ax.scatter(점), ax.bar/ax.barh(막대), ax.hist(히스토그램), ax.fill_between(영역).
각 메서드는 데이터 값을 위치·길이·색·크기 같은 시각 채널로 매핑하며, 그린 결과를 나타내는 Artist 객체(예: Line2D, PathCollection)를 반환합니다.
반환 객체를 변수로 받아 두면 나중에 색·라벨·투명도를 바꾸거나 범례를 세밀하게 제어할 수 있습니다.
import matplotlib.pyplot as plt
import numpy as np
rng = np.random.default_rng(0)ax.plot -꺾은선plot은 점들을 입력 순서대로 선으로 잇습니다. x가 시간처럼 순서를 가질 때 적합합니다.
x = np.linspace(0, 2 * np.pi, 100)
fig, ax = plt.subplots()
line, = ax.plot(x, np.sin(x), label="sin", color="C0", linewidth=2, linestyle="-")
ax.plot(x, np.cos(x), label="cos", color="C1", linestyle="--")
ax.legend()Line2D 객체들의 리스트입니다. line, = ax.plot(...)처럼 언패킹해 하나를 꺼냅니다.color(또는 c), linewidth(lw), linestyle(ls), marker, alpha.
그려지는 것: 0부터 2π 구간에서 매끄러운 사인 곡선(실선)과 코사인 곡선(파선)이 겹쳐 그려지고, 우상단 등에 범례 박스가 생깁니다.line.set_color("red") # 반환 객체로 사후 수정💡 이럴 때: x를 생략하고
ax.plot(y)만 주면 x는0, 1, 2, ...인덱스가 됩니다. 관측 순서만 볼 때 유용합니다.
ax.scatter -산점도scatter는 점을 잇지 않습니다. 두 수치 변수의 관계를 볼 때 씁니다. 점마다 색(c)과 크기(s)를 따로 줄 수 있어 3~4번째 변수를 추가로 인코딩할 수 있습니다.
n = 200
xv = rng.normal(size=n)
yv = xv * 0.7 + rng.normal(size=n)
weight = rng.uniform(10, 200, size=n)
fig, ax = plt.subplots()
sc = ax.scatter(xv, yv, c=weight, s=weight / 4, cmap="viridis", alpha=0.7)
fig.colorbar(sc, ax=ax, label="weight")PathCollection 하나입니다. colorbar에 넘겨 색↔값 대응표를 표시합니다. → Python - matplotlib 05. 스타일·색상·컬러맵c→색(명도/색상), s→면적. 색과 면적은 위치보다 비교 정확도가 낮은 보조 채널입니다.alpha를 낮추거나 ax.hexbin(...) / 2D 밀도로 대체합니다.💡 이럴 때: 점이 수만 개를 넘어 뭉개지면 투명도만으로는 부족합니다.
ax.hexbin(xv, yv, gridsize=40)으로 밀도를 육각형 격자에 집계해 그립니다.
ax.bar / ax.barh -막대막대는 범주별 값의 크기 비교에 씁니다. 값이 길이로 인코딩되므로 기준선은 반드시 0이어야 합니다.
cats = ["A", "B", "C", "D"]
vals = [23, 45, 12, 38]
fig, ax = plt.subplots()
bars = ax.bar(cats, vals, color="C0") # 세로 막대
# ax.barh(cats, vals) # 가로 막대(범주 이름이 길 때)
ax.bar_label(bars, padding=3) # 막대 끝에 값 표시BarContainer이며 개별 막대(Rectangle)를 담습니다. ax.bar_label(bars)로 수치 라벨을 붙입니다.ax.bar(x - w/2, v1, w) / ax.bar(x + w/2, v2, w)로 나란히, ax.bar(cats, v2, bottom=v1)로 쌓기.barh(가로)가 읽기 편합니다.💡 이럴 때: 막대그래프의 y축을 0이 아닌 값에서 시작하면 차이가 과장되어 보입니다(오해를 부르는 시각화). 막대는 항상
ax.set_ylim(bottom=0)을 유지합니다.
ax.hist -히스토그램히스토그램은 한 수치 변수의 분포를 봅니다. 값 범위를 구간(bin)으로 나누고 각 구간의 빈도를 막대 높이로 그립니다.
data = rng.normal(loc=50, scale=10, size=1000)
fig, ax = plt.subplots()
counts, bin_edges, patches = ax.hist(data, bins=30, edgecolor="white")
# ax.hist(data, bins="auto", density=True) # 확률밀도로 정규화, 자동 bin 개수(counts, bin_edges, patches) 3-튜플입니다. counts는 구간별 빈도, bin_edges는 경계값, patches는 막대 Artist들입니다.bins가 결과 해석을 좌우합니다. 너무 적으면 형태가 뭉개지고, 너무 많으면 노이즈가 보입니다. bins="auto"(또는 "fd", "sturges")로 시작해 조정합니다.ax.hist([g1, g2], bins=20, label=[...]) 또는 겹쳐 그리기(histtype="step", alpha=0.5).
그려지는 것: 평균 50 근처가 가장 높은 종 모양(정규분포에 가까운) 막대 무리가 그려집니다.💡 이럴 때: 분포의 봉우리 개수·치우침을 보고 싶은데 bin 선택이 불안하면, 히스토그램 위에 KDE(커널 밀도)를 겹칩니다. 이때는 seaborn
sns.histplot(data, kde=True, ax=ax)가 편합니다. → Python - matplotlib 08. pandas·seaborn와의 연계
ax.fill_between -영역과 밴드fill_between은 두 곡선(또는 곡선과 축) 사이를 색으로 채웁니다. 신뢰구간·오차 밴드·임계 영역 표시에 씁니다.
x = np.linspace(0, 10, 100)
y = np.sin(x)
err = 0.2
fig, ax = plt.subplots()
ax.plot(x, y, color="C0")
ax.fill_between(x, y - err, y + err, alpha=0.3, color="C0", label="±0.2")
ax.fill_between(x, y, where=(y > 0), alpha=0.1, color="green") # 조건부 채움where= 불리언 배열로 특정 구간만 채웁니다.ax.fill_betweenx(y, x1, x2).💡 이럴 때: 예측선과 함께 불확실성을 보여줄 때, 얇은 오차선(errorbar) 대신 반투명 밴드(
fill_between)를 쓰면 추세와 불확실성을 한눈에 읽을 수 있습니다.
💡 이럴 때: "무슨 그래프를 그릴지" 막히면 데이터 타입부터 봅니다. 1변수 수치→hist, 2변수 수치→scatter, 범주별 값→bar, 시간축→plot. → 데이터 전처리·시각화 이론 학습 로드맵 2.3
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.