【Python】 그라데이션을 만드는 함수를 만들었다

11350 단어 Python3matplotlib

하고 싶은 일





많은 데이터가 있을 때 matplotlib에서 보통으로 플롯하면 매우 보기 힘들다.
배포 자료로 만들거나 스스로 데이터에서 추세를 읽는 것은 불편합니다.
그래서 그라데이션으로 하고 싶습니다.

했던 일



numpy.linspace처럼 그라데이션을 만들 수 있는 함수를 만들었습니다.

사용법
1. gradation 함수를 copipe
2. 컬러 코드(sRGB)를 구그 start, end에 넣습니다.
3. return은 sRGB 문자열 목록입니다.
import numpy as np
import matplotlib
import matplotlib.pyplot as plt


def gradation(start="#CCCCCC", end="#00519A", step=5):
    """
        before use it
        import numpy as np

    return like this:
    ['#cccccc', '#bc9aa8', '#b95ba9', '#8b2aa9', '#370e83']
    """
    from colorsys import rgb_to_hls, hls_to_rgb
    if len(start) != 7 or len(end) != 7:
        raise Exception(
            f"argument length must be 7: now{len(start)}, {len(end)}")
    rgb_s = (int(start[i:i + 2], 16) / 256 for i in range(1, 4))
    rgb_e = (int(end[i:i + 2], 16) / 256 for i in range(1, 4))
    hls_s = np.array(rgb_to_hls(*rgb_s))
    hls_e = np.array(rgb_to_hls(*rgb_e))
    diff_hls = hls_e - hls_s
    # color is circle
    diff_hls[0] = (diff_hls[0] + 0.5) - np.floor(diff_hls[0] + 0.5) - 0.5
    hls_list = [hls_s + diff_hls * i / step for i in range(step)]
    rgb_list = [hls_to_rgb(*p) for p in hls_list]
    # Transeform floor rgb to Strings rgb
    str_rgb = []
    for rgb in rgb_list:
        str_rgb.append(
            f"#{int(rgb[0]* 256):02x}{int(rgb[1]* 256):02x}{int(rgb[2]* 256):02x}")
    return str_rgb


def main():
    nsinx = 5
    x = np.linspace(0, np.pi * 4, 100)
    dx = np.pi / (nsinx)
    sinxes = [np.sin(x - i * dx) for i in range(nsinx)]
    gra = gradation(start="#CCCCCC", end="#00519A", step=nsinx)
    for i, sinx in enumerate(sinxes):
        plt.plot(x, sinx, label=f"dx*{i}", lw=3, color=gra[i])
    plt.legend()
    plt.show()


if __name__ == "__main__":
    main()

추가
함수 내에서 import 등 PEP8을 준수하지 않습니다.
코피페에서 쉽게 사용할 수 있도록 하기 위해서입니다.
copipe 코딩 스타일은 유지 보수성이 마치 안됩니다.
어떻게든하고 싶지만 패키징 할 정도는 아니기 때문에
뭔가 좋은 생각이 있으면 가르쳐주세요.

참고문헌



매우 참고가 되었습니다.
감사합니다.
Python 로 그라데이션 중 색상 찾기

좋은 웹페이지 즐겨찾기