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、引数vminvmax0.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より大きい値の場合、「オーバー」または「アンダー」の色が返されます。デフォルトでは、カラーマップの下部/上部の色ですが、これは変更可能です。例えば: cmap.set_under('red'); print cmap(0.0), cmap(-0.01)
ジョー・キングトン

こんにちは、@ジョー、訂正ありがとうございます。私の回答を変更しました:)
Ffisegydd '20

set_badin np.nannp.infiircの目的を定義するものもあります。Normalizeここでもメソッドに言及する必要があります。
tacaswell 2014

12
非常に有用な情報と、なぜ地球上でこれをドキュメントで見つけることが不可能であるのか!?!
Jaap Eldering 2017年

10
これが誰にとっても機能せず、が表示される場合はmodule 'matplotlib' has no attribute 'cm'、最初の2行を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、OrRs、Ord、Orrd、OrRd、OrRd、OrRd、OrRd 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_Purples_r、RdrRdRdBu、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、YlGn、YlGnBur、YlGlBu、YlGn_r、YlGlBu、YlGn_r、YlGlBu、YlGn_r afmhot_r、autumn、autumn_r、binary、binary_r、bone、bone_r、brg、brg_r、bwr、bwr_r、cividis、cividis_r、cool、cool_r、coolwarm、coolwarm_r、copper、copper_r、cubehelix、cubehelix_r、flag、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、nog_rr、norvr、r、guprr、norvr、r、rupr、norr jet_r、magma、magma_r、nipy_spectral、nipy_spectral_r、ocean、ocean_r、pink、pink_r、plasma、plasma_r、prism、prism_r、rainbow、rainbow_r、seismic、seismic_r、spring、spring_r、summer、summer_r、tab10、tab10_r、tab20_r tab20b、tab20b_r、tab20c、tab20c_r、terrain、terrain_r、twilight、twilight_r、twilight_shifted、twilight_shifted_r、viridis、viridis_r、winter、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、pink_r、plasma、plasma_r、prism、prism_r、rainbow、rainbow_r、seismic spring、spring_r、summer、summer_r、tab10、tab10_r、tab20、tab20_r、tab20b、tab20b_r、tab20c、tab20c_r、terrain、terrain_r、twilight、twilight_r、twilight_shifted、twilight_shifted_r、viridis、viridis_r、winter、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、pink_r、plasma、plasma_r、prism、prism_r、rainbow、rainbow_r、seismic spring、spring_r、summer、summer_r、tab10、tab10_r、tab20、tab20_r、tab20b、tab20b_r、tab20c、tab20c_r、terrain、terrain_r、twilight、twilight_r、twilight_shifted、twilight_shifted_r、viridis、viridis_r、winter、winter、rviridis、viridis_r、winter、winter_rviridis、viridis_r、winter、winter_r

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.