복붙노트

[PYTHON] 범위 값을 의사 색으로

PYTHON

범위 값을 의사 색으로

0부터 100까지의 부동 소수점 배열을 파이썬에서 가지고 있습니다. 색상이 녹색 (0에 해당)에서 빨간색 (100)까지 다양하도록 의사 색상 이미지를 만들고 싶습니다. 이것은 matplotlib의 pcolor와 유사합니다. 그러나, 나는 pcolor를 사용하고 싶지 않다.

'val'에 대한 의사 색상 값에 해당하는 RGB 트리플을 반환하는 pseudocolorForValue (val, (minval, maxval))와 같은 함수가 있습니까? 또한이 기능을 사용하여 녹색에서 빨간색으로 또는 빨간색에서 녹색으로 색상을 표시할지 여부를 선택할 수 있습니까?

감사, 닉

해결법

  1. ==============================

    1.0 ... 100 => 0 ... 120 도의 값을 변환 한 다음 HSV (또는 HLS) 색상 공간에서 색상의 H (또는 각도)로이 값을 사용하는 자체 함수를 작성할 수 있습니다. 그러면이를 표시하기 위해 RGB 색상으로 변환 할 수 있습니다. 선형 해석 된 색상은 종종이 색상 공간에서 계산 될 때 더 잘 나타납니다. HSV 색상 공간은 다음과 같습니다.

    0 ... 100 => 0 ... 120 도의 값을 변환 한 다음 HSV (또는 HLS) 색상 공간에서 색상의 H (또는 각도)로이 값을 사용하는 자체 함수를 작성할 수 있습니다. 그러면이를 표시하기 위해 RGB 색상으로 변환 할 수 있습니다. 선형 해석 된 색상은 종종이 색상 공간에서 계산 될 때 더 잘 나타납니다. HSV 색상 공간은 다음과 같습니다.

    최신 정보:

    좋은 소식은, 파이썬이 내장 된 colorsys 모듈 (실제로는 "배터리 포함"이라는 뜻)에서 색상 공간 변환 루틴을 가지고 있음을 발견 한 것에 유쾌하게 놀랐습니다. 그것에 대해 좋은 점은 아래에 설명 된 것처럼 쉽게 설명했던 기능을 만드는 것입니다.

    from colorsys import hsv_to_rgb
    
    def pseudocolor(val, minval, maxval):
        """ Convert val in range minval..maxval to the range 0..120 degrees which
            correspond to the colors Red and Green in the HSV colorspace.
        """
        h = (float(val-minval) / (maxval-minval)) * 120
    
        # Convert hsv color (h,1,1) to its rgb equivalent.
        # Note: hsv_to_rgb() function expects h to be in the range 0..1 not 0..360
        r, g, b = hsv_to_rgb(h/360, 1., 1.)
        return r, g, b
    
    if __name__ == '__main__':
        steps = 10
    
        print('val       R      G      B')
        for val in range(0, 100+steps, steps):
            print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
                                                    val, *pseudocolor(val, 0, 100)))
    

    산출:

    val       R      G      B
      0 -> (1.000, 0.000, 0.000)
     10 -> (1.000, 0.200, 0.000)
     20 -> (1.000, 0.400, 0.000)
     30 -> (1.000, 0.600, 0.000)
     40 -> (1.000, 0.800, 0.000)
     50 -> (1.000, 1.000, 0.000)
     60 -> (0.800, 1.000, 0.000)
     70 -> (0.600, 1.000, 0.000)
     80 -> (0.400, 1.000, 0.000)
     90 -> (0.200, 1.000, 0.000)
    100 -> (0.000, 1.000, 0.000)
    

    출력 결과는 다음과 같습니다.

    제 다른 대답보다 색이 더 멋지다고 느낄 수 있다고 생각합니다.

    일반화 :

    이 함수를 수정하면 현재 레드와 그린 이외의 다른 색상과 함께 사용할 수 있다는 점에서 좀 더 일반적인 의미로 사용할 수 있습니다.

    방법은 다음과 같습니다.

    def pseudocolor(val, minval, maxval, start_hue, stop_hue):
        """ Convert val in range minval..maxval to the range start_hue..stop_hue
            degrees in the HSV colorspace.
        """
        h = (float(val-minval) / (maxval-minval)) * (stop_hue-start_hue) + start_hue
    
        # Convert hsv color (h,1,1) to its rgb equivalent.
        # Note: hsv_to_rgb() function expects h to be in the range 0..1 not 0..360
        r, g, b = hsv_to_rgb(h/360, 1., 1.)
        return r, g, b
    
    if __name__ == '__main__':
        # angles of common colors in hsv colorspace
        RED, YELLOW, GREEN, CYAN, BLUE, MAGENTA = range(0, 360, 60)
        steps = 10
    
        print('val       R      G      B')
        for val in range(0, 100+steps, steps):
            print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
                    val, *pseudocolor(val, 0, 100, YEllOW, BLUE)))
    

    결과 :

  2. ==============================

    2.논란의 여지는 있지만 HLS 또는 HSV 색상 공간에서 H를 보간하는 것만큼이나 예쁜 것은 아니지만 접근법을 구현하는 것이 훨씬 더 간단합니다. 단일 값을 완전 적색 (1,0, 0) 및 완전히 녹색 (0,1,0)으로 설정됩니다.

    논란의 여지는 있지만 HLS 또는 HSV 색상 공간에서 H를 보간하는 것만큼이나 예쁜 것은 아니지만 접근법을 구현하는 것이 훨씬 더 간단합니다. 단일 값을 완전 적색 (1,0, 0) 및 완전히 녹색 (0,1,0)으로 설정됩니다.

    여기 내가 의미하는 바가있다.

    def pseudocolor(val, minval, maxval):
        """ Convert value in the range minval...maxval to a color between red
            and green.
        """
        f = float(val-minval) / (maxval-minval)
        r, g, b = 1-f, f, 0.
        return r, g, b
    
    if __name__ == '__main__':
        steps = 10
        print('val       R      G      B')
        for val in xrange(0, 100+steps, steps):
            print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
                        val, *pseudocolor(val, 0, 100)))
    

    산출:

    val       R      G      B
      0 -> (1.000, 0.000, 0.000)
     10 -> (0.900, 0.100, 0.000)
     20 -> (0.800, 0.200, 0.000)
     30 -> (0.700, 0.300, 0.000)
     40 -> (0.600, 0.400, 0.000)
     50 -> (0.500, 0.500, 0.000)
     60 -> (0.400, 0.600, 0.000)
     70 -> (0.300, 0.700, 0.000)
     80 -> (0.200, 0.800, 0.000)
     90 -> (0.100, 0.900, 0.000)
    100 -> (0.000, 1.000, 0.000)
    

    필요에 따라 부동 소수점 r, g, b 구성 요소를 변형 할 수 있습니다 (예 : 0..255 범위의 정수).

    출력 결과는 다음과 같습니다.

    녹색에서 빨간색으로 이동하려면 함수의 r 및 g에 대한 계산을 역순으로 수행하면됩니다. 너무 많은 노력을 기울이지 않으면 개념을 일반화하여 주어진 두 색상 사이에서 선형 보간을 허용 할 수 있습니다.

    다음과 같이 할 수 있습니다.

    def pseudocolor(val, minval, maxval, startcolor, stopcolor):
        """ Convert value in the range minval...maxval to a color in the range
            startcolor to stopcolor. The colors passed and the the one returned are
            composed of a sequence of N component values.
        """
        f = float(val-minval) / (maxval-minval)
        return tuple(f*(b-a)+a for (a, b) in zip(startcolor, stopcolor))
    
    if __name__ == '__main__':
        YELLOW, BLUE = (1, 1, 0), (0, 0, 1)
        steps = 10
    
        print('val       R      G      B')
        for val in range(0, 100+steps, steps):
            print('{:3d} -> ({:.3f}, {:.3f}, {:.3f})'.format(
                        val, *pseudocolor(val, 0, 100, YELLOW, BLUE)))
    

    제공된 색상을 사용한 샘플 출력 :

  3. ==============================

    3.matplolib에 내장 된 색상 맵을 직접 액세스 할 수 있습니다.이 색상 맵은 pcolor가 색상 맵핑을 결정하기 위해 사용하는 색상입니다. 각 맵은 [0, 1] 범위의 부동 소수점을 가져 와서 구성 요소 (R, G, B, A)로 [0, 1] 범위의 부동 소수점 4 개 요소 튜플을 반환합니다. 다음은 표준 제트 색상 맵을 사용하여 RGBA 튜플을 반환하는 함수의 예입니다.

    matplolib에 내장 된 색상 맵을 직접 액세스 할 수 있습니다.이 색상 맵은 pcolor가 색상 맵핑을 결정하기 위해 사용하는 색상입니다. 각 맵은 [0, 1] 범위의 부동 소수점을 가져 와서 구성 요소 (R, G, B, A)로 [0, 1] 범위의 부동 소수점 4 개 요소 튜플을 반환합니다. 다음은 표준 제트 색상 맵을 사용하여 RGBA 튜플을 반환하는 함수의 예입니다.

    from matplotlib import cm
    
    def pseudocolor(val, minval, maxmal):
        # Scale val to be in the range [0, 1]
        val = (val - minval) / (maxval - minval)
        # Return RGBA tuple from jet colormap
        return cm.jet(val)
    
    pseudocolor(20, 0, 100)
    # Returns: (0.0, 0.3, 1.0, 1.0)
    
    pseudocolor(80, 0, 100)
    # Returns: (1.0, 0.4074, 0.0, 1.0)
    

    이것은 아래 이미지에 표시된 색상 범위에 매핑됩니다.

    이 방법의 편리한 기능 중 하나는 cm.jet을 cm.rainbow, cm.nipy_spectral, cm.Accent 등으로 변경하여 matplotlib 색상 표 중 하나를 쉽게 전환 할 수 있다는 것입니다.

  4. from https://stackoverflow.com/questions/10901085/range-values-to-pseudocolor by cc-by-sa and MIT license