รับสีแต่ละสีจากแผนที่สีใน matplotlib


144

หากคุณมี Colormap 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)

คำตอบ:


231

คุณสามารถทำได้โดยใช้รหัสด้านล่างและรหัสในคำถามของคุณนั้นใกล้เคียงกับสิ่งที่คุณต้องการมากสิ่งที่คุณต้องทำก็คือเรียก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เพียงดังที่แสดงในตัวอย่างเล็ก ๆ ด้านล่างซึ่งอาร์กิวเมนต์vminและvmaxอธิบายว่าตัวเลขใดที่ควรแมปเป็น 0.0 และ 1.0 ตามลำดับ

import matplotlib

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

print(norm(15.0)) # 0.5

นอกจากนี้ยังมีlogarithmic normaliser ( matplotlib.colors.LogNorm ) สำหรับช่วงข้อมูลที่มีค่าเป็นจำนวนมาก

(ขอบคุณทั้งJoe Kingtonและtcaswellสำหรับคำแนะนำในการปรับปรุงคำตอบ)


3
ที่จริงแล้วสำหรับค่าที่น้อยกว่า 0 หรือมากกว่า 1 จะส่งกลับสี "over" หรือ "under" โดยค่าเริ่มต้นจะเป็นสีที่ด้านล่าง / ด้านบนของ colormap แต่สามารถเปลี่ยนแปลงได้ ตัวอย่างเช่น: cmap.set_under('red'); print cmap(0.0), cmap(-0.01)
Joe Kington

สวัสดี @ โจขอบคุณสำหรับการแก้ไขฉันได้แก้ไขคำตอบของฉันแล้ว :)
Ffisegydd

นอกจากนี้ยังมีset_badที่กำหนดว่าในทำเพื่ออะไรnp.nanและnp.infiirc คุณควรพูดถึงNormalizeวิธีการที่นี่ด้วย
tacaswell

14
ข้อมูลที่เป็นประโยชน์มากและเหตุใดจึงไม่พบสิ่งนี้ในเอกสารนี้!?!
Jaap Eldering

10
หากสิ่งนี้ไม่ได้ผลสำหรับใครและคุณเห็นmodule 'matplotlib' has no attribute 'cm'ให้ลองแทนที่สองบรรทัดแรกด้วยimport matplotlib.pyplot as plt; cmap = plt.cm.get_cmap('Spectral')
ไม่ระบุตัวตน

10

เพื่อให้ได้ค่า rgba จำนวนเต็มแทนที่จะเป็นค่า float เราสามารถทำได้

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

1

ในการสร้างโซลูชันจากFfisegyddและamaliammr ต่อไปนี้เป็นตัวอย่างที่เราสร้างการนำเสนอ CSV สำหรับ Colormap ที่กำหนดเอง:

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

-1

เพื่อความสมบูรณ์นี่คือตัวเลือก cmap ที่ฉันพบจนถึงตอนนี้:

สำเนียง, Accent_r, บลูส์, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, สีเขียว, Greens_r, สีเทา, Greys_r, OrRd, OrRd, OrRd PRGn_r, คู่, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples_BuRy, Rd, RduGn_r RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, สเปกตรัม, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBur, YlGnBu_, YlGnBu_ afmhot_r, ฤดูใบไม้ร่วง, autumn_r, ไบนารี, binary_r, กระดูก, 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_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_yplarg_r, gnuplot_r สีเทา, gnuplot2, gnuplot2 jet_r, แมกมา, magma_r, nipy_spectral, nipy_spectral_r, มหาสมุทร, ocean_r, สีชมพู, pink_r, พลาสม่า, plasma_r, ปริซึม, prism_r, รุ้ง, rainbow_r, แผ่นดินไหว, seismic_r, ฤดูใบไม้ผลิ, spring_r, ฤดูร้อน, summer_r, tab10, tab10_r, tab20, 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, pink_r, plasma, plasma_r, prism, prism_r, rainbow, rainbow_r, seismic ฤดูใบไม้ผลิ, ฤดูใบไม้ผลิ_r, ฤดูร้อน, ฤดูร้อน _r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, ภูมิประเทศ, Terrain_r, พลบค่ำ, twilight_r, twilight_shifted, twilight_shifted_r, viridis, viridis_r, ฤดูหนาว, winter_rgrey_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, seicic ฤดูใบไม้ผลิ spring_r ฤดูร้อน summer_r tab10 tab10_r tab20 tab20_r tab20b tab20b_r tab20c tab20c_r ภูมิประเทศภูมิประเทศviridis, viridis_r, ฤดูหนาว, winter_rviridis, viridis_r, ฤดูหนาว, winter_r

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.