从matplotlib中的颜色贴图中获取单个颜色

Lon*_*Rob 102 python colors matplotlib

如果你有一个Colormap

cmap = matplotlib.cm.get_cmap('Spectral')
Run Code Online (Sandbox Code Playgroud)

如何在0和1之间获得特定的颜色,其中0.0是地图中的第一种颜色,1.0是地图中的最后一种颜色?

理想情况下,我可以通过以下方式获得地图中的中间颜色:

>>> do_some_magic(cmap, 0.5) # Return an RGBA tuplet
(0.1, 0.2, 0.3, 1.0)
Run Code Online (Sandbox Code Playgroud)

Ffi*_*ydd 175

您可以使用下面的代码执行此操作,并且您的问题中的代码实际上非常接近您所需的代码,您所要做的就是调用cmap您拥有的对象.

import matplotlib

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

rgba = cmap(0.5)
print(rgba) # (0.99807766255210428, 0.99923106502084169, 0.74602077638401709, 1.0)
Run Code Online (Sandbox Code Playgroud)

对于范围[0.0,1.0]之外的值,它将返回欠色和高色(分别).默认情况下,这是范围内的最小和最大颜色(因此0.0和1.0).可以使用cmap.set_under()和更改此默认值cmap_set_over().

为"特殊"的数字,如np.nannp.inf所述缺省值是使用了0.0的值,这可以使用被改变cmap.set_bad()类似于下并如上过来.

最后,您可能需要对数据进行标准化,使其符合范围[0.0, 1.0].这可以使用matplotlib.colors.Normalize简单的方法完成,如下面的小例子所示,其中参数vminvmax描述应分别映射到0.0和1.0的数字.

import matplotlib

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

print(norm(15.0)) # 0.5
Run Code Online (Sandbox Code Playgroud)

对数标准化器(matplotlib.colors.LogNorm)也可用于具有大范围值的数据范围.

(感谢Joe Kingtontcaswell提出的关于如何改进答案的建议.)

  • 非常有用的信息以及为什么在文档中找不到它是不可能的!?! (7认同)
  • 如果这对任何人都不起作用,并且您看到模块'matplotlib'没有属性'cm',请尝试将前两行替换为“ import matplotlib.pyplot as plt;”。cmap = plt.cm.get_cmap('Spectral')` (6认同)
  • 由于这种方式已被弃用,这里有一种最新的方式:`import matplotlib``cmap = matplotlib.colormaps["Spectral"]` (4认同)
  • 实际上,对于小于0或大于1的值,它将返回"over"或"under"颜色.默认情况下,它是色彩图底部/顶部的颜色,但这是可以改变的.例如:`cmap.set_under('red'); print cmap(0.0),cmap(-0.01)` (3认同)

Bin*_*nod 14

我曾经遇到过类似的情况,我需要“n”不。颜色图中的颜色,以便我可以将每种颜色分配给我的数据。我已经在名为“ mycolorpy ”的包中编译了一个代码。您可以使用 pip 安装它:

pip install mycolorpy
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

from mycolorpy import colorlist as mcp
import numpy as np
Run Code Online (Sandbox Code Playgroud)

示例:从 cmap“winter”创建 5 个十六进制字符串的列表

color1=mcp.gen_color(cmap="winter",n=5)
print(color1)
Run Code Online (Sandbox Code Playgroud)

输出:

['#0000ff', '#0040df', '#0080bf', '#00c09f', '#00ff80']
Run Code Online (Sandbox Code Playgroud)

另一个从 cmap bwr 生成 16 种颜色列表的示例:

color2=mcp.gen_color(cmap="bwr",n=16)
print(color2)
Run Code Online (Sandbox Code Playgroud)

输出:

['#0000ff', '#2222ff', '#4444ff', '#6666ff', '#8888ff', '#aaaaff', '#ccccff', '#eeeeff', '#ffeeee', '#ffcccc', '#ffaaaa', '#ff8888', '#ff6666', '#ff4444', '#ff2222', '#ff0000']
Run Code Online (Sandbox Code Playgroud)

有一个python 笔记本,其中包含使用示例,可​​以更好地形象化这一点。

假设您想要从归一化为给定数据的 cmap 生成颜色列表。您可以使用以下方法来做到这一点:

a=random.randint(1000, size=(200))
a=np.array(a)
color1=mcp.gen_color_normalized(cmap="seismic",data_arr=a)
plt.scatter(a,a,c=color1)
Run Code Online (Sandbox Code Playgroud)

输出: 在此输入图像描述

您还可以使用以下方法反转颜色:

color1=mcp.gen_color_normalized(cmap="seismic",data_arr=a,reverse=True)
plt.scatter(a,a,c=color1)
Run Code Online (Sandbox Code Playgroud)

输出: 在此输入图像描述

  • 这并没有回答OP的问题,尽管它已经有了一个很好的认可答案。除此之外,已经有一些工具可以很好地执行您所描述的过程,例如 CMasher (https://cmasher.readthedocs.io/index.html)。 (2认同)
  • @1313e:“优秀的认可答案”不再起作用。所以就是这样。不过,感谢您提供这个优秀图书馆的链接。 (2认同)
  • 太感谢了!拯救了我的一天。 (2认同)

ama*_*mmr 7

为了获得rgba整数值而不是float值,我们可以

rgba = cmap(0.5,bytes=True)
Run Code Online (Sandbox Code Playgroud)

因此,为了简化基于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
Run Code Online (Sandbox Code Playgroud)