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.