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.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
Run Code Online (Sandbox Code Playgroud)
对数标准化器(matplotlib.colors.LogNorm)也可用于具有大范围值的数据范围.
(感谢Joe Kington和tcaswell提出的关于如何改进答案的建议.)
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)
为了获得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)