从 matplotlib 中的颜色图中获取单独的颜色

2025-03-18 08:54:00
admin
原创
47
摘要:问题描述:如果你有一个Colormap cmap,例如:cmap = matplotlib.cm.get_cmap('Spectral') 如何从 0 到 1 之间获取特定颜色,其中 0 是地图中的第一个颜色,而 1 是地图中的最后一种颜色?理想情况下,我可以通过执行以下操作来获取地图中的中间颜色:>&...

问题描述:

如果你有一个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)

解决方案 1:

您可以使用下面的代码执行此操作,并且问题中的代码实际上非常接近您需要的,您所要做的就是调用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 Kington和tcaswell对如何改进答案提出的建议。)

解决方案 2:

为了获取 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

解决方案 3:

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

pip install mycolorpy

然后你可以执行以下操作:

from mycolorpy import colorlist as mcp
import numpy as np

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

color1=mcp.gen_color(cmap="winter",n=5)
print(color1)

输出:

['#0000ff', '#0040df', '#0080bf', '#00c09f', '#00ff80']

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

color2=mcp.gen_color(cmap="bwr",n=16)
print(color2)

输出:

['#0000ff', '#2222ff', '#4444ff', '#6666ff', '#8888ff', '#aaaaff', '#ccccff', '#eeeeff', '#ffeeee', '#ffcccc', '#ffaaaa', '#ff8888', '#ff6666', '#ff4444', '#ff2222', '#ff0000']

有一个包含使用示例的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)

输出:
在此处输入图片描述

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

color1=mcp.gen_color_normalized(cmap="seismic",data_arr=a,reverse=True)
plt.scatter(a,a,c=color1)

输出:
在此处输入图片描述

解决方案 4:

我发现使用 matplotlib 返回十六进制颜色列表的很短的方法N

import matplotlib

# Choose colormap
cmap = plt.cm.get_cmap('terrain', N)
colors = [matplotlib.colors.to_hex(cmap(i)) for i in range(N)]

更新

由于 get_cmap 函数在 Matplotlib 3.7 中已弃用并将很快被删除,因此选项可能是

import matplotlib

# Choose colormap
cmap = matplotlib.colormaps.get_cmap('terrain')

# Pick N numbers from 0 to 1
gradient = np.linspace(0, 1, N)
colors = [matplotlib.colors.to_hex(cmap(i)) for i in gradient]

解决方案 5:

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

我最初尝试简单地随机生成颜色,在每次绘图之前重新播种 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()

得到的图可能不是最好的例子,但是当以交互方式放大时它会变得更具相关性。
正常运行时间 + T 计

解决方案 6:

为了基于Ffisegydd和amaliammr的解决方案,下面是一个示例,我们在其中为自定义颜色图制作了 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]))

解决方案 7:

颜色图有其自己的标准化方法,因此如果您已经制作了图表,则可以访问某个值的颜色。

import matplotlib.pyplot as plt
import numpy as np

cmap = plt.cm.viridis

cm = plt.pcolormesh(np.random.randn(10, 10), cmap=cmap)

print(cmap(cm.norm(2.2)))

解决方案 8:

我通常使用的是

import matplotlib.pyplot as plt

n=10 # number of colors you want to get
cmap = plt.cm.get_cmap('rainbow', n) # get 10 colors from rainbow palette

# Use the color
cmap(0)
cmap(1)
...
cmap(9)

解决方案 9:

这是一个给出离散颜色值的解决方案。可以通过将离散颜色图一分为二来确定中点。

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# Choose a colormap from Matplotlib
colormap = plt.cm.viridis

# Set number of colors
num_colors = 5

# Create a ListedColormap with discrete colors
discrete_cmap = ListedColormap(colormap(np.linspace(0, 1, num_colors)))

# Output RGB values
for i, rgb in enumerate(discrete_cmap.colors):
    print(f"Color {i + 1}: RGB = {rgb}")

# Plot a colorbar to visualize
plt.imshow([[i] for i in range(num_colors)], cmap=discrete_cmap, aspect='auto')
plt.colorbar(ticks=range(num_colors))
plt.show()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用