matplotlib에서 선 그래프의 선 색상을 데이터 값에 따라 다르게 표현하려면 LineCollection과 컬러맵(Colormap)을 함께 활용하면 됩니다. 이 기법을 사용하면 곡선의 기울기나 값의 변화량에 따라 선의 색상이 자동으로 바뀌므로, 데이터의 변화 추이를 한눈에 파악할 수 있습니다.
구현 단계
그림(figure) 크기를 설정하고 서브플롯 사이와 주변의 여백을 조정합니다.
numpy를 이용해 x, y 데이터 포인트를 생성합니다. (여기서는 sin 곡선을 사용)
인접 구간의 기울기 값인 dydx를 계산합니다.
numpy로 points와 segments 배열을 생성하여 선분 정보를 준비합니다.
figure와 서브플롯 세트를 생성합니다.
plt.Normalize()로 데이터를 일정 범위로 정규화합니다.컬러맵과 정규화 기준을 적용한 LineCollection을 만들고,
set_array()로 색상 결정에 사용할 배열을 지정합니다.set_linewidth()로 선 두께를 설정합니다.첫 번째 축(axs[0])에 컬렉션을 추가하고 colorbar를 표시합니다.
ListedColormap으로 빨강(r), 초록(g), 파랑(b) 색상 목록에서 컬러맵 객체를 생성하고,BoundaryNorm으로 값 경계를 나누어 두 번째 축(axs[1])에도 동일한 방식으로 적용합니다.X축과 Y축의 표시 범위(limit)를 설정합니다.
show()메서드를 호출하여 그림을 화면에 표시합니다.
예제 코드
import numpy as np import matplotlib.pyplot as plt from matplotlib.collections import LineCollection from matplotlib.colors import ListedColormap, BoundaryNorm plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True x = np.linspace(0, 3 * np.pi, 500) y = np.sin(x) dydx = np.cos(0.5 * (x[:-1] + x[1:])) points = np.array([x, y]).T.reshape(-1, 1, 2) segments = np.concatenate([points[:-1], points[1:]], axis=1) fig, axs = plt.subplots(2, 1, sharex=True, sharey=True) norm = plt.Normalize(dydx.min(), dydx.max()) lc = LineCollection(segments, cmap='viridis', norm=norm) lc.set_array(dydx) lc.set_linewidth(2) line = axs[0].add_collection(lc) fig.colorbar(line, ax=axs[0]) cmap = ListedColormap(['r', 'g', 'b']) norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N) lc = LineCollection(segments, cmap=cmap, norm=norm) lc.set_array(dydx) lc.set_linewidth(2) line = axs[1].add_collection(lc) fig.colorbar(line, ax=axs[1]) axs[0].set_xlim(x.min(), x.max()) axs[0].set_ylim(-1.1, 1.1) plt.show()
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
첫 번째 그래프: viridis 연속형 컬러맵을 사용해 기울기(dydx) 값의 크기에 따라 선 색상이 부드럽게 변화합니다.
두 번째 그래프: r, g, b 세 가지 색상으로 구성된 이산형 컬러맵과 BoundaryNorm을 적용해, 기울기 값의 구간(-1 ~ -0.5, -0.5 ~ 0.5, 0.5 ~ 1)에 따라 선 색상이 단계적으로 구분됩니다.

핵심 포인트 정리
이 기법의 핵심은 일반적인 plt.plot() 대신 LineCollection을 사용하는 것입니다. LineCollection은 곡선을 수많은 작은 선분(segment)으로 나누어 처리하며, set_array()로 전달된 값(여기서는 dydx)을 기준으로 각 선분의 색상을 개별적으로 지정할 수 있습니다. 이를 응용하면 시간의 흐름, 속도, 가속도 등 다양한 데이터 값에 따라 선 색상을 동적으로 표현할 수 있습니다.