Matplotlib의 색상 표에서 개별 색상 얻기


136

cmap예를 들어 컬러 맵이있는 경우 :

cmap = matplotlib.cm.get_cmap('Spectral')

0과 1 사이에서 특정 색상을 얻는 방법은 무엇입니까? 0은지도의 첫 번째 색상이고 1은지도의 마지막 색상입니다.

이상적으로는 다음을 수행하여 맵에서 중간 색상을 얻을 수 있습니다.

>>> do_some_magic(cmap, 0.5) # Return an RGBA tuple
(0.1, 0.2, 0.3, 1.0)

답변:


219

아래 코드를 사용 하여이 작업을 수행 할 수 있으며 질문의 코드는 실제로 필요한 것에 매우 가깝습니다. 수행해야 할 것은 cmap객체를 호출하는 것입니다.

import matplotlib

cmap = matplotlib.cm.get_cmap('Spectral')

rgba = cmap(0.5)
print(rgba) # (0.99807766255210428, 0.99923106502084169, 0.74602077638401709, 1.0)

[0.0, 1.0] 범위를 벗어난 값의 경우 언더 컬러와 오버 컬러를 각각 반환합니다. 기본적으로이 범위 내의 최소 및 최대 색입니다 (따라서 0.0 및 1.0). 이 기본값은 cmap.set_under()및 로 변경할 수 있습니다 cmap.set_over().

기본값 np.nan과 같은 "특수"숫자의 np.inf경우 0.0 값을 사용하는 경우 cmap.set_bad()위와 같이 위 / 아래와 유사 하게이 값을 변경할 수 있습니다 .

마지막으로 데이터가 범위에 맞도록 데이터를 정규화해야 할 수도 있습니다 [0.0, 1.0]. 이것을 사용하여 수행 될 수 matplotlib.colors.Normalize간단히 인수 여기서 아래 작은 예에 도시 vminvmax수치는 각각 0.0과 1.0로 매핑되어야 하는지를 설명한다.

import matplotlib

norm = matplotlib.colors.Normalize(vmin=10.0, vmax=20.0)

print(norm(15.0)) # 0.5

로그 노멀 라이저 ( matplotlib.colors.LogNorm )는 넓은 범위의 값을 가진 데이터 범위에도 사용할 수 있습니다.

( Joe Kingtontcaswell 에게 답변을 개선하는 방법에 대한 제안을 주셔서 감사합니다 .)


3
실제로 0보다 작거나 1보다 큰 값은 "over"또는 "under"색상을 반환합니다. 기본적으로 컬러 맵의 아래쪽 / 위쪽에있는 색상이지만 변경할 수 있습니다. 예를 들면 : cmap.set_under('red'); print cmap(0.0), cmap(-0.01)
조 킹톤

안녕 @Joe, 보정 주셔서 감사합니다, 나는 :) 내 대답을 수정 한
Ffisegydd

또한이 set_bad에 대한 무엇을 정의하는 np.nannp.infIIRC. Normalize여기에서도 방법을 언급해야 합니다.
tacaswell

12
매우 유용한 정보와 왜 지구상에서 문서를 찾을 수 없는가!?!
Jaap Eldering

10
이것이 아무에게도 효과 module 'matplotlib' has no attribute 'cm'import matplotlib.pyplot as plt; cmap = plt.cm.get_cmap('Spectral')
Anonymous

9

float 값 대신 rgba 정수 값을 얻으려면 다음을 수행하십시오.

rgba = cmap(0.5,bytes=True)

따라서 Ffisegydd의 답변을 기반으로 코드를 단순화하기 위해 코드는 다음과 같습니다.

#import colormap
from matplotlib import cm

#normalize item number values to colormap
norm = matplotlib.colors.Normalize(vmin=0, vmax=1000)

#colormap possible values = viridis, jet, spectral
rgba_color = cm.jet(norm(400),bytes=True) 

#400 is one of value between 0 and 1000

0

Ffisegyddamaliammr 의 솔루션을 기반 으로하는 사용자 지정 컬러 맵에 대한 CSV 표현의 예는 다음과 같습니다.

#! /usr/bin/env python3
import matplotlib
import numpy as np 

vmin = 0.1
vmax = 1000

norm = matplotlib.colors.Normalize(np.log10(vmin), np.log10(vmax))
lognum = norm(np.log10([.5, 2., 10, 40, 150,1000]))

cdict = {
    'red':
    (
        (0., 0, 0),
        (lognum[0], 0, 0),
        (lognum[1], 0, 0),
        (lognum[2], 1, 1),
        (lognum[3], 0.8, 0.8),
        (lognum[4], .7, .7),
    (lognum[5], .7, .7)
    ),
    'green':
    (
        (0., .6, .6),
        (lognum[0], 0.8, 0.8),
        (lognum[1], 1, 1),
        (lognum[2], 1, 1),
        (lognum[3], 0, 0),
        (lognum[4], 0, 0),
    (lognum[5], 0, 0)
    ),
    'blue':
    (
        (0., 0, 0),
        (lognum[0], 0, 0),
        (lognum[1], 0, 0),
        (lognum[2], 0, 0),
        (lognum[3], 0, 0),
        (lognum[4], 0, 0),
    (lognum[5], 1, 1)
    )
}


mycmap = matplotlib.colors.LinearSegmentedColormap('my_colormap', cdict, 256)   
norm = matplotlib.colors.LogNorm(vmin, vmax)
colors = {}
count = 0
step_size = 0.001
for value in np.arange(vmin, vmax+step_size, step_size):
    count += 1
    print("%d/%d %f%%" % (count, vmax*(1./step_size), 100.*count/(vmax*(1./step_size))))
    rgba = mycmap(norm(value), bytes=True)
    color = (rgba[0], rgba[1], rgba[2])
    if color not in colors.values():
        colors[value] = color

print ("value, red, green, blue")
for value in sorted(colors.keys()):
    rgb = colors[value]
    print("%s, %s, %s, %s" % (value, rgb[0], rgb[1], rgb[2]))

0

완전성을 위해 이것은 지금까지 만난 cmap 선택입니다.

Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrGd, Orr_ 오렌지, OrR_ PR PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, RsBud, RdBud, RdBu, RdBu, RdBu, RdBu RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Wistia, Wistia_r, YlGr, YlGrYlYrGlYrYlGnBuy afmhot_r, 가을, autumn_r, 이진, binary_r, 뼈, bone_r, brg, brg_r, bwr, bwr_r, cividis, cividis_r, cool, cool_r, coolwarm, coolwarm_r, 구리, copper_r, cubehelix, cubehelix_r, 플래그, flag_r, gist_earth, gist_earthgist_gray, gist_gray_r, gist_heat, gist_heat_r, gist_ncar, gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r,의 gnuplot, gnuplot2, gnuplot2_r, gnuplot_r, 회색, gray_r, 뜨거운 hot_r, HSV, hsv_r, 파열, inferno_r, 제트 jet_r, 마그마, magma_r, nipy_spectral, nipy_spectral_r, 대양, ocean_r, 핑크, pink_r, 플라즈마, plasma_r, 프리즘, prism_r, rainbow, rainbow_r, 지진, 지진 _r, 봄, spring_r, 여름, summer_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, 지형, 지형 _r, 황혼, twilight_r, twilight_shifted, twilight_shifted_r, viridis, viridis_r, 겨울, winter_rgray_r, hot, hot_r, hsv, hsv_r, inferno, inferno_r, jet, jet_r, magma, magma_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r, 핑크, pink_r, 플라즈마, plasma_r, 프리즘, 프리즘 _r, 무지개, rainbow_r, 지진, 지진, 지진 봄, spring_r, 여름, summer_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, 지형, 터 레인 _r, 어스름, twilight_r, twilight_shifted, twilight_shifted_r, viridis, viridis_r, 겨울, winter_rgray_r, hot, hot_r, hsv, hsv_r, inferno, inferno_r, jet, jet_r, magma, magma_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r, 핑크, pink_r, 플라즈마, plasma_r, 프리즘, 프리즘 _r, 무지개, rainbow_r, 지진, 지진, 지진 봄, spring_r, 여름, summer_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, 지형, 터 레인 _r, 어스름, twilight_r, twilight_shifted, twilight_shifted_r, viridis, viridis_r, 겨울, winter_rviridis, viridis_r, 겨울, winter_rviridis, viridis_r, 겨울, winter_r

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.