본 포스팅은 Python line chart를 활용하여 주로 사용했던 방법과 옵션을 정리하였습니다.
line chart는 아래 두 줄 만으로도 차트가 그려집니다.
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = np.array([3, 3, 5, 6, 7, 11, 22, 21, 3, 5])
plt.plot(x, y)
plt.show()
1. 단일 차트
plt.figure(figsize=(20, 4))
plt.plot(x, y, label = 'y')
plt.xlabel("x")
plt.ylabel("y")
plt.title("example")
plt.legend()
plt.show()
차트 크기 : plt.figure(figsize=(max, min))
범례 추가 : plt.plot(x, y, label = ‘y’) 안에 y값의 범례명을 적어 준 후 plt.legend() 함수 사용
축 라벨링 : x축의 경우 plt.xlabel(“x축명”) , plt.ylabel(“y축명”)
차트 제목 : plt.title(“차트명”)
축라벨과 차트 제목 크기를 변경하고 싶다면 fontsize 옵션을 사용하면 됩니다.
2. 한 차트에 데이터 추가
y1 = np.array([4, 4, 6, 7, 8, 14, 26, 20, 6, 8])
plt.figure(figsize=(20, 4))
plt.plot(x, y, label = 'y', color = 'red')
plt.plot(x, y1, linestyle='dashed', label = 'y1', color = 'violet')
plt.xlabel("x")
plt.ylabel("y")
plt.title("example")
plt.legend(ncol=1, fontsize = 12, frameon = True, shadow = True)
plt.show()
한 차트 프레임안에 두 개의 line을 그리는 경우는 plt.plot()을 추가해주면 됩니다.
차트를 구분하기 위해 라벨과 색상을 추가하였고, 범례부분의 옵션을 추가로 사용해보았습니다.
Matplotlib는 색상, 선크기, 선종류 등 다양하게 지원하므로 해당 문서를 참고하길 바랍니다.
라인 색상 : plt.plot(x, y, label = ‘y’, color = ‘red’)
라인 종류 : linestyle=’dashed’
범례 종류 : plt.legend(ncol=1, fontsize = 12, frameon = True, shadow = True)
line style 지정하기
Solid, Dashed, Dotted, Dash-dot과 같이 네가지 종류를 선택할 수 있습니다.
범례 옵션별 차이점은 아래 4.차트 프레임 2개 이상 사용에서 비교하였습니다.
legend 위치 지정하기
loc 파라미터를 사용하고 숫자 튜플 또는 문자로 입력하면 됩니다.
loc=(0.0, 0.0)은 데이터 영역의 왼쪽 아래, loc=(1.0, 1.0)은 데이터 영역의 오른쪽 위 이며 ‘best’, ‘upper right’, ‘upper left’, ‘lower left’, ‘right’, ‘center left’, ‘center right’, ‘lower center’, ‘upper center’ 등으로 사용가능햡니다.
default 값는 ‘best’입니다.
3. 한줄에 여러 차트 그리기
fig, axes = plt.subplots(1, 2, figsize = (20,4))
axes[0].plot(x, y, label = 'y', color = 'red')
axes[0].set_xlabel("x")
axes[0].set_ylabel("y")
axes[0].legend(ncol=1, fontsize = 12, frameon = True, shadow = True)
axes[0].set_title("example_y")
axes[1].plot(x, y1, label = 'y1', color='violet')
axes[1].set_xlabel("x")
axes[1].set_ylabel("y1")
axes[1].legend(ncol=1, fontsize = 12, frameon = True, shadow = True)
axes[1].set_title("example_y1")
plt.show()
2번은 두 line을 한 차트에 그렸지만 개별적으로 그리고 싶을 때는 plt.subplots()를 이용하면 됩니다.
plt.subplots()를 fig와 axes로 받고 첫번째 차트는 axes[0] , 두번째 차트는 axes[1]로 사용하여 각각 차트별 옵션을 다르게 설정할 수도 있고, 옵션이 동일하다면 코드의 중복을 피하기 위해 for문을 사용하는 것도 방법일 것입니다.
4. 여러줄에 차트 그리기
y2 = np.array([5, 4, 8, 8, 5, 21, 42, 22, 12, 13])
y3 = np.array([4, 10, 14, 7, 10, 51, 34, 31, 16,15])
fig, axes = plt.subplots(2, 2, figsize = (20,10))
axes[0,0].plot(x, y, label = 'y', color = 'red')
axes[0,0].set_xlabel("x")
axes[0,0].set_ylabel("y")
axes[0,0].legend(ncol=1, fontsize = 12, frameon = True, shadow = True)
axes[0,0].set_title("example_y")
axes[0,1].plot(x, y1, label = 'y1', color='violet')
axes[0,1].set_xlabel("x")
axes[0,1].set_ylabel("y1")
axes[0,1].legend(ncol=1, fontsize = 12, frameon = False, shadow = False)
axes[0,1].set_title("example_y1")
axes[1,0].plot(x, y2, label = 'y2', color='lime')
axes[1,0].plot(x, y1, label = 'y1', color='red')
axes[1,0].set_xlabel("x")
axes[1,0].set_ylabel("y2")
axes[1,0].legend(ncol=2, fontsize = 12, frameon = True, shadow = True)
axes[1,0].set_title("example_y2")
p1 = axes[1,1].plot(x, y3, label = 'y3', color='navy')
axes[1,1].set_xlabel("x")
axes[1,1].set_ylabel("y3")
axes[1,1].set_title("example_y2")
ax = axes[1,1].twinx()
p2 =ax.plot(x, y1, label = 'y1', color='red')
ax.set_ylabel("y1")
p = p1+p2
pl = [l.get_label() for l in p]
ax.legend(p, pl, ncol=2, fontsize = 12, frameon = True, shadow = True)
plt.show()
여러 행과 열로 차트를 그리는 경우 axes 지정 방식이 달라집니다.
[행, 열]로 구분하여 차트별로 옵션 지정을 다르게 할 수 있습니다.
1) 첫번째 차트는 위의 기본 코드와 동일
2) 두번째 차트는 범례 옵션에서 frameon과 shadow를 False로 주어 테두리와 그림자를 없앰
3) 세번째 차트는 범례를 ncol=2로 설정함으로써 범례가 가로 일직선의 형태이며 범례를 나열할 열의 갯수를 의미
4) 네번째 차트는 두 line의 y축을 모두 표시하고 싶을 때 사용하는 방법으로 twinx() 보조축을 추가할 수 있고, 보조축을 사용하는 경우라면 아래와 같은 점을 유의
매서드명 확인
기존 한 차트만 그릴때 사용하던 xlabel, ylabel, title을 그대로 사용하면 오류가 나고 앞에 set_을 붙여서 사용해야합니다.
axes[1,1].set_xlabel("text")
axes[1,1].set_ylabel("text")
axes[1,1].set_title("text")
5. 차트에 수평/수직선 그리기
수평선
plt.axhline(고정 y축 값, 시작범위,종료범위) 인자를 받고있는데 이때 시작범위와 종료범위는 0에서 1사이의 값으로 적어주어야 하며 0은 왼쪽 끝, 1은 오른쪽 끝을 의미합니다.
plt.hlines(고정 y축 값, 시작범위,종료범위) 의 시작범위는 실제 x값의 최소, 종료범위는 실제 x값의 최대 값을 적으면 됩니다.
수평선 : plt.axhline(y, xmin, xmax), plt.hlines(y, xmin, xmax)
수직선
plt.axvline(), plt.vlines() 함수는 위의 수평선 함수와 사용법은 같습니다.
수직선 : plt.axvline(x, ymin, ymax), plt.vlines(x, ymin, ymax)
각 수평선, 수직선 함수의 차이를 비교해보도록 해봅시다.
fig, axes = plt.subplots(1, 2, figsize=(20, 4))
axes[0].plot(x, y, label='y', color='red')
axes[0].set_xlabel("x")
axes[0].set_ylabel("y")
axes[0].legend(ncol=1, fontsize=12, frameon=True, shadow=True)
axes[0].set_title("example_y")
# 수평선
axes[0].axhline(15, 0.3, 0.7, color = 'green', linestyle ='--')
axes[0].hlines(10, 2, 6, color = 'green', linestyle ='-')
axes[1].plot(x, y1, label='y1', color='violet')
axes[1].set_xlabel("x")
axes[1].set_ylabel("y1")
axes[1].legend(ncol=1, fontsize=12, frameon=True, shadow=True)
axes[1].set_title("example_y1")
# 수직선
axes[1].axvline(6, 0.3, 0.7, color = 'green', linestyle ='--')
axes[1].vlines(8, 5, 15, color = 'green', linestyle ='-')
plt.show()
3. 차트 프레임 2개 사용한 차트에 수평/수직선을 추가해보았습니다. 수평선은 고정이 되는 y값을 수직선은 x 축 값을 인자로 받고 어느 정도의 범위의 선을 구할 것인지 인자로 적어주면 됩니다.
6. 차트에 강조 구간 그리기
수평구간
plt.axhspan(y축시작, y축 종료)를 기본 인자로 받으며 추가로 x축의 범위를 적어주지 않으면 차트 처음부터 끝까지의 구간이 그려집니다. x축에 대한 부분을 끝까지 다 그리지 않을 경우는 plt.axhspan(y축시작, y축 종료, x축시작범위, y축시작범위)로 작성해야하며, 이때 시작범위와 종료범위는 0에서 1사이의 값으로 적어주어야 합니다.
수평구간 : plt.axhspan(ymin, ymax, xmin-비율, xmax-비율)
수직구간
plt.axhspan(), plt.axvspan() 함수는 위의 수평구간 함수와 사용법은 같습니다
수직구간 : plt.axvspan(xmin, xmax, ymin-비율, ymax-비율)
각 수평구간, 수직구간 함수의 차이를 비교해보도록 해봅시다.
fig, axes = plt.subplots(1, 2, figsize=(20, 4))
axes[0].plot(x, y, label='y', color='red')
axes[0].set_xlabel("x")
axes[0].set_ylabel("y")
axes[0].legend(ncol=1, fontsize=12, frameon=True, shadow=True)
axes[0].set_title("example_y")
# 수평구간
axes[0].axhspan(10, 15, alpha=0.3, color = 'blue')
axes[1].plot(x, y1, label='y1', color='violet')
axes[1].set_xlabel("x")
axes[1].set_ylabel("y1")
axes[1].legend(ncol=1, fontsize=12, frameon=True, shadow=True)
axes[1].set_title("example_y1")
# 수직구간
axes[1].axvspan(4, 6, alpha=0.3, color = 'blue')
plt.show()
fig, axes = plt.subplots(1, 2, figsize=(20, 4))
axes[0].plot(x, y, label='y', color='red')
axes[0].set_xlabel("x")
axes[0].set_ylabel("y")
axes[0].legend(ncol=1, fontsize=12, frameon=True, shadow=True)
axes[0].set_title("example_y")
# 수평구간
axes[0].axhspan(10, 15, 0.1, 0.8, alpha=0.3, color = 'blue')
axes[1].plot(x, y1, label='y1', color='violet')
axes[1].set_xlabel("x")
axes[1].set_ylabel("y1")
axes[1].legend(ncol=1, fontsize=12, frameon=True, shadow=True)
axes[1].set_title("example_y1")
# 수직선
axes[1].axvspan(4, 6, 0.1, 0.8, alpha=0.3, color = 'blue')
plt.show()
감사합니다 :)
참고자료
'머신러닝&딥러닝 > Python' 카테고리의 다른 글
[R과 Python 비교] 데이터 프레임 병합하는 다양한 방법 (0) | 2022.05.24 |
---|---|
[scikit-learn] PCA 기능 (0) | 2022.05.18 |
[Jupyter notebook] 아나콘다 가상 환경 생성 및 활용 (0) | 2022.05.10 |
[GitHub] 내 코드 관리하기! (0) | 2019.05.03 |
[R과 Python 비교] 범주형변수 처리(OneHotEncoding) (3) | 2019.03.28 |