Matplotlib'deki renk haritasından tek tek renkleri alma


136

cmapÖrneğin bir Colormap'iniz varsa :

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

0 ile 1 arasında belirli bir rengi nasıl elde edebilirsiniz, burada 0 haritadaki ilk renktir ve 1 haritadaki son renktir?

İdeal olarak, haritadaki orta rengi elde edebilirim:

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

Yanıtlar:


219

Bunu aşağıdaki kodla yapabilirsiniz ve sorunuzdaki kod aslında ihtiyacınız olana çok yakındı, tek yapmanız gereken sahip olduğunuz cmapnesneyi çağırmak .

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] aralığının dışındaki değerler için alt ve üst rengi (sırasıyla) döndürür. Bu, varsayılan olarak, aralık içindeki minimum ve maksimum renktir (yani 0.0 ve 1.0). Bu varsayılan cmap.set_under()ve ile değiştirilebilir cmap.set_over().

np.nanVe np.infvarsayılan gibi "özel" sayılar için 0.0 değerini kullanmak, bu cmap.set_bad()yukarıdaki gibi alt ve üste benzer şekilde değiştirilebilir .

Son olarak, verilerinizi aralığa uyacak şekilde normalleştirmeniz gerekebilir [0.0, 1.0]. Bu kullanarak yapılabilir matplotlib.colors.Normalizebasitçe argümanlar yerin altındaki küçük örnekte gösterildiği vminve vmaxsayıları sırasıyla 0.0 ile 1.0 aktarılması gerektiğini açıklayın.

import matplotlib

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

print(norm(15.0)) # 0.5

Geniş bir değer aralığına sahip veri aralıkları için logaritmik normalleştirici ( matplotlib.colors.LogNorm ) de mevcuttur.

( Cevabın nasıl geliştirileceğine dair öneriler için Joe Kington ve tcaswell'e teşekkürler .)


3
Aslında, 0'dan küçük veya 1'den büyük değerler için "üst" veya "alt" renk döndürür. Varsayılan olarak renk haritasının altındaki / üstündeki renktir, ancak bu değiştirilebilir. Örneğin: cmap.set_under('red'); print cmap(0.0), cmap(-0.01)
Joe Kington

Merhaba @Joe, düzeltme için teşekkürler, cevabımı değiştirdim :)
Ffisegydd

Ayrıca, set_badin np.nanve np.infiirc için ne işe yaradığını tanımlar. NormalizeBuradaki yöntemlerden de bahsetmelisiniz .
tacaswell

12
Çok faydalı bilgiler ve bunu neden belgelerde bulmak imkansız!?!
Jaap Eldering

10
Bu kimse için işe yaramazsa ve görüyorsanız module 'matplotlib' has no attribute 'cm', ilk iki satırı değiştirmeyi deneyinimport matplotlib.pyplot as plt; cmap = plt.cm.get_cmap('Spectral')
Anonymous

9

Float değeri yerine rgba tam sayı değeri elde etmek için yapabiliriz

rgba = cmap(0.5,bytes=True)

Yani kodu Ffisegydd tarafından verilen cevaba göre basitleştirmek için kod şöyle olacaktır:

#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

Ffisegydd ve amaliammr çözümlerini geliştirmek için, özel bir renk haritası için CSV temsili yaptığımız bir örnek:

#! /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

Tamlık için bunlar şimdiye kadar karşılaştığım cmap seçimleridir:

Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Yeşiller, Greens_r, Griler, Greys, Orr, Orr, Orr PRGn_r, Eşleştirilmiş, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Kırmızılar, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3, Set3_r, Spektral, Spektral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu, YrGrBl, YrGrBl, YrGrBl, sonbahar, ikili, kemik, bone_r, brg, brg_r, bwr, bwr_r, cividis, cividis_r, serin, cool_r, coolwarm, coolwarm_r, bakır, copper_r, cubehelix, cubehelix_r, serin, cool_r, coolwarm, coolwarm_r, bakırgist_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, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gist_rainbow_r, gistupster, gnuplot2, gnuplot2, gnuplot, gnuplot2, gnuplot, gnuplot2, gnuplot2, jet_r, magma, magma_r, nipy_spectral, nipy_spectral_r, okyanus, okyanus_r, pembe, pembe_r, plazma, plazma_r, prizma, prizma, gökkuşağı, gökkuşağı_r, sismik, sismik_r, bahar, bahar tab20b, tab20b_r, tab20c, tab20c_r, arazi, terrain_r, alacakaranlık, alacakaranlık_r, alacakaranlık_yüklü, alacakaranlıkgri, sıcak, sıcak, sıcak, okyanus, okyanus, pembe, pembe, plazma, plazma_r, prizma, prizma, prizma, gökkuşağı, gökkuşağı, sismik, gökkuşağı, gökkuşağı, sismik bahar, bahar, yaz, yaz_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, arazi, terrain_r, alacakaranlık, alacakaranlık_r, alacakaranlık_yüklü, alacakaranlıkgri, sıcak, sıcak, sıcak, okyanus, okyanus, pembe, pembe, plazma, plazma_r, prizma, prizma, prizma, gökkuşağı, gökkuşağı, sismik, gökkuşağı, gökkuşağı, sismik bahar, bahar, yaz, yaz_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, arazi, terrain_r, alacakaranlık, alacakaranlık_r, alacakaranlık_yüklü, alacakaranlıkviridis, viridis_r, kış, winter_rviridis, viridis_r, kış, winter_r

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.