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

时间:2014-08-20 15:12:27

标签: python matplotlib colors

如果您有来自

的色彩映射表
cmap = matplotlib.cm.get_cmap('Spectral')

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

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

>>> do_some_magic(cmap, 0.5) # Return an RGBA tuplet
(0.1, 0.2, 0.3, 1.0)

5 个答案:

答案 0 :(得分:142)

您可以使用下面的代码执行此操作,问题中的代码实际上非常接近您所需的内容,您只需调用您拥有的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.nannp.inf之类的数字默认使用0.0值,这可以使用cmap.set_bad()更改,类似于上面的under和over。

最后,您可能需要对数据进行规范化,使其符合范围[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

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

(感谢Joe Kingtontcaswell提供有关如何改进答案的建议。)

答案 1 :(得分:4)

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

答案 2 :(得分:3)

我正好遇到了这个问题,但我需要连续的图来具有高度对比的颜色。我还使用包含参考数据的公共子图绘制图,因此我希望颜色序列始终可重复。

我最初尝试简单地随机生成颜色,在每个绘图之前重新播种 RNG。这工作正常(在下面的代码中注释掉),但可能会产生几乎无法区分的颜色。我想要高度对比的颜色,最好从包含所有颜色的颜色图中采样。

我可以在一个图中包含多达 31 个数据系列,因此我将颜色图分成了许多步骤。然后我按顺序走几步,确保我不会很快回到给定颜色的附近。

我的数据是一个高度不规则的时间序列,所以我想查看点和线,点的颜色与线的“相反”。

鉴于上述所有内容,最简单的方法是生成带有相关参数的字典来绘制各个系列,然后将其扩展为调用的一部分。

这是我的代码。也许不漂亮,但实用。

from matplotlib import cm
cmap = cm.get_cmap('gist_rainbow')  #('hsv') #('nipy_spectral')

max_colors = 31   # Constant, max mumber of series in any plot.  Ideally prime.
color_number = 0  # Variable, incremented for each series.

def restart_colors():
    global color_number
    color_number = 0
    #np.random.seed(1)

def next_color():
    global color_number
    color_number += 1
    #color = tuple(np.random.uniform(0.0, 0.5, 3))
    color = cmap( ((5 * color_number) % max_colors) / max_colors )
    return color

def plot_args():  # Invoked for each plot in a series as: '**(plot_args())'
    mkr = next_color()
    clr = (1 - mkr[0], 1 - mkr[1], 1 - mkr[2], mkr[3])  # Give line inverse of marker color
    return {
        "marker": "o",
        "color": clr,
        "mfc": mkr,
        "mec": mkr,
        "markersize": 0.5,
        "linewidth": 1,
    }

我的上下文是 JupyterLab 和 Pandas,所以这是示例情节代码:

restart_colors()  # Repeatable color sequence for every plot

fig, axs = plt.subplots(figsize=(15, 8))
plt.title("%s + T-meter"%name)

# Plot reference temperatures:
axs.set_ylabel("°C", rotation=0)
for s in ["T1", "T2", "T3", "T4"]:
    df_tmeter.plot(ax=axs, x="Timestamp", y=s, label="T-meter:%s" % s, **(plot_args()))

# Other series gets their own axis labels
ax2 = axs.twinx()
ax2.set_ylabel(units)

for c in df_uptime_sensors:
    df_uptime[df_uptime["UUID"] == c].plot(
        ax=ax2, x="Timestamp", y=units, label="%s - %s" % (units, c), **(plot_args())
    )

fig.tight_layout()
plt.show()

结果图可能不是最好的例子,但当交互式放大时它变得更加相关。 uptime + T-meter

答案 3 :(得分:0)

要以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]))

答案 4 :(得分:0)

为完整起见,这些是我到目前为止遇到的cmap选择:

  

Accent,Accent_r,Blues,Blues_r,BrBG,BrBG_r,BuGn,BuGn_r,BuPu,   BuPu_r,CMRmap,CMRmap_r,Dark2,Dark2_r,GnBu,GnBu_r,绿色,   Greens_r,Greys,Greys_r,OrRd,OrRd_r,Oranges,Oranges_r,PRGn,   PRGn_r,成对,成对_r,Pastel1,Pastel1_r,Pastel2,Pastel2_r,   PiYG,PiYG_r,PuBu,PuBuGn,PuBuGn_r,PuBu_r,PuOr,PuOr_r,PuRd,   PuRd_r,Purples,Purples_r,RdBu,RdBu_r,RdGy,RdGy_r,RdPu,RdPu_r,   RdYlBu,RdYlBu_r,RdYlGn,RdYlGn_r,Reds,Reds_r,Set1,Set1_r,Set2,   Set2_r,Set3,Set3_r,Spectral,Spectral_r,Wistia,Wistia_r,YlGn,   YlGnBu,YlGnBu_r,YlGn_r,YlOrBr,YlOrBr_r,YlOrRd,YlOrRd_r,affhot,   afmhot_r,秋天,autumn_r,二进制,binary_r,骨骼,bone_r,brg,   brg_r,bwr,bwr_r,cividis,cividis_r,cool,cool_r,coolwarm,   coolwarm_r,铜,copper_r,cubehelix,cubehelix_r,标志,flag_r,   gist_earth,gist_earth_r,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_yarg_r,gnuplot,gnuplot2,   gnuplot2_r,gnuplot_r,gray,gray_r,hot,hot_r,hsv,hsv_r,地狱,   inferno_r,jet,jet_r,岩浆,岩浆_r,nipy_spectral,nipy_spectral_r,   海洋,ocean_r,粉红色,pink_r,等离子,plasma_r,棱镜,prismic_r,   彩虹,rainbow_r,地震,argument_r,春季,spring_r,夏季,   summer_r,tab10,tab10_r,tab20,tab20_r,tab20b,tab20b_r,tab20c,   tab20c_r,terrain,terrain_r,twilight,twilight_r,twilight_shifted,   twilight_shifted_r,viridis,viridis_r,冬天,winter_r