Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib 선 그래프에서 데이터 값에 따라 선 색상을 변경하는 방법

matplotlib에서 선 그래프의 선 색상을 데이터 값에 따라 다르게 표현하려면 LineCollection과 컬러맵(Colormap)을 함께 활용하면 됩니다. 이 기법을 사용하면 곡선의 기울기나 값의 변화량에 따라 선의 색상이 자동으로 바뀌므로, 데이터의 변화 추이를 한눈에 파악할 수 있습니다.

구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 사이와 주변의 여백을 조정합니다.

  • numpy를 이용해 x, y 데이터 포인트를 생성합니다. (여기서는 sin 곡선을 사용)

  • 인접 구간의 기울기 값인 dydx를 계산합니다.

  • numpy로 pointssegments 배열을 생성하여 선분 정보를 준비합니다.

  • 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)에 따라 선 색상이 단계적으로 구분됩니다.

Matplotlib 선 그래프에서 데이터 값에 따라 선 색상을 변경하는 방법

핵심 포인트 정리

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