在Python中将整数值范围映射到颜色
我有一些整数,范围从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")