从matplotlib中的颜色映射获取单个颜色

2024-06-12 08:44:37 发布

您现在位置:Python中文网/ 问答频道 /正文

如果有颜色映射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)

Tags: angetreturnmatplotlib颜色magic地图情况
3条回答

为了得到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

为了构建来自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]))

您可以使用下面的代码来实现这一点,而且问题中的代码实际上与您需要的非常接近,您所要做的只是调用您拥有的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]的值,它将返回欠色和过色(分别)。默认情况下,这是该范围内的最小和最大颜色(so 0.0和1.0)。可以使用cmap.set_under()cmap.set_over()更改此默认值。

对于像np.nannp.inf这样的“特殊”数字,默认值是使用0.0值,这可以使用cmap.set_bad()进行更改,类似于上面的under和over。

最后,您可能需要规范化数据,使其符合范围[0.0, 1.0]。这可以使用^{}来完成,如下面的小示例所示,其中参数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对如何改进答案的建议。)

相关问题 更多 >