在Python中将整数值范围映射到颜色

8 投票
2 回答
7163 浏览
提问于 2025-04-19 21:50

我有一些整数,范围从0到10000。我想给每个整数对应一种颜色。然后根据这个整数的值,我想得到与这个整数对应的颜色的RGB值。简单来说,我想在两种或多种颜色之间实现一种渐变效果。例如,如果颜色是绿色和红色,那么绿色的权重最低(0),红色的权重最高(10000)。我该如何使用matplotlib来实现这个映射,或者有没有其他库可以做到这一点。

2 个回答

0

一种在两个极端之间变化的颜色图叫做“发散色图”。在matplotlib这个库里,有一种叫做RdYlGn(红-黄-绿)的颜色图,正好符合你的需求。你可以查看一下这个颜色图参考。不过我不确定它的范围是否是从0到10,000,但它肯定可以处理从0到100的范围,你可以把你的范围映射到这个区间里。

10

确实可以从给定的颜色图中抽取10000种颜色:

#!/usr/bin/python3

from numpy import arange

from matplotlib import pyplot as plt
from matplotlib import cm
from matplotlib.colors import LinearSegmentedColormap


# ======
## data:

N = 10000
data = arange(N +1)


# =================
## custom colormap:

# red-green colormap:
cdict = {'red':   [(0.0, 1.0, 1.0),  # red decreases
                   (1.0, 0.0, 0.0)],

         'green': [(0.0, 0.0, 0.0),  # green increases
                   (1.0, 1.0, 1.0)],

         'blue':  [(0.0, 0.0, 0.0),  # no blue at all
                   (1.0, 0.0, 0.0)]}

red_green_cm = LinearSegmentedColormap('RedGreen', cdict, N)


# ======
## plot:

colors = cm.get_cmap(red_green_cm, N)

fig = plt.figure()
ax = fig.add_subplot(111)

# each line is of its own color:
for i, x in enumerate(data):
    ax.plot(data, data*x, color=colors(i))

fig.savefig("red-green-cm.png")

结果:

在这里输入图片描述

编辑

还可以添加一个颜色条:

#!/usr/bin/python3

from numpy import arange

import matplotlib as mpl
from matplotlib import pyplot as plt
from matplotlib import cm
from matplotlib.colors import LinearSegmentedColormap


# ======
## data:

N = 10000
data = arange(N +1)


# =================
## custom colormap:

# red-green colormap:
cdict = {'red':   [(0.0, 1.0, 1.0),  # red decreases
                   (1.0, 0.0, 0.0)],

         'green': [(0.0, 0.0, 0.0),  # green increases
                   (1.0, 1.0, 1.0)],

         'blue':  [(0.0, 0.0, 0.0),  # no blue at all
                   (1.0, 0.0, 0.0)] }

red_green_cm = LinearSegmentedColormap('RedGreen', cdict, N)


# ======
## plot:

colors = cm.get_cmap(red_green_cm, N)

fig = plt.figure()
ax = fig.add_subplot(111)

# each line is of its own color:
for i, x in enumerate(data):
    ax.plot(data, data*x, color=colors(i))

# make space for colorbar:
fig.tight_layout(rect=[0, 0, 0.85, 1])

# adding colorbar:
ax_cb = fig.add_axes([0.85, 0.10, 0.05, 0.8])
norm = mpl.colors.Normalize(vmin=data[0], vmax=data[-1])
cb = mpl.colorbar.ColorbarBase(ax_cb, cmap=red_green_cm, norm=norm, orientation='vertical')

fig.savefig("red-green-cm.png")

在这里输入图片描述

撰写回答