pbj0812의 코딩 일기

[PYTHON] 음영이 포함된 라인차트 그리기 본문

ComputerLanguage_Program/PYTHON

[PYTHON] 음영이 포함된 라인차트 그리기

pbj0812 2022. 3. 16. 02:23

0. 목표

 - 음영이 포함된 라인차트 그리기

1. 실습

 1) library 호출

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
from matplotlib.patches import Polygon

 2) 함수 생성

  - 인자로 x, y, 라인(+ 음영) 색상 삽입

def area_gradation(x, y, color = 'b'):
    x = np.array(x)
    y = np.array(y)
    fig, ax = plt.subplots()
    line, = ax.plot(x, y, color)
    fill_color = line.get_color() # 선 색상 얻기(HEX 형식)
    zorder = line.get_zorder() # zorder(layer 위치) 값
    alpha = 1
    z = np.empty((100, 1, 4), dtype = float) # rgb + alpha 
    rgb = mcolors.colorConverter.to_rgb(fill_color) # HEX 형식에서 rgb 로 변경
    z[:,:,:3] = rgb # z 의 앞 3 칸에 입력
    z[:,:,-1] = np.linspace(0, alpha, 100)[:,None] # alpha 값 작성 0 ~ 1 까지 100 등분하고 형태 변환한 값을 z 의 마지막 칸에 입력
    xmin, xmax, ymin, ymax = x.min(), x.max(), y.min(), y.max() # x, y array 에서 최소 최대값 획득
    im = ax.imshow(z, aspect='auto', extent=[xmin, xmax, ymin, ymax], # extent 로 축 범위 설정
                       origin='lower', zorder=zorder) # origin 으로 gradation 방향 설정
    # gradation 을 전체 범위에서 해당 폴리곤 범위에 적용
    xy = np.column_stack([x, y]) # x + y 로 2차원 행렬 생성
    xy = np.vstack([[xmin, ymin], xy, [xmax, ymin], [xmin, ymin]])
    clip_path = Polygon(xy, facecolor='none', edgecolor='none', closed=True)
    ax.add_patch(clip_path)
    im.set_clip_path(clip_path)
    ax.autoscale(True)
    return im, fig, ax

 3) 그림 그리기

im, fig, ax = area_gradation([1, 2, 3, 4, 5, 6, 7], [1, 4, 3, 9, 10, 12, 8], 'k')
# 축 
ax.set_xlabel('x', fontsize = 20)
ax.set_ylabel('y', fontsize = 20)
# 그림 크기
fig.set_size_inches(15, 10)

2. 결과

3. 참고

 1) Is it possible to get color gradients under curve in matplotlib?

 2) matplotlib에서 layer 순서 정하기

 3) [파이썬 matplotlib] 이미지맵(imshow) 범위설정하기

 4) origin and extent in imshow

 5) [python] matplotlib로 그린 그림의 크기를 어떻게 변경합니까?

 6) 27. 함수 인자(Arguments)

 7) [Python NumPy] 배열을 옆으로, 위 아래로 붙이기 : np.r_, np.c_, np.hstack(), np.vstack(), np.column_stack(), np.concatenate(axis=0), np.concatenate(axis=1)

Comments