如果您有来自
的色彩映射表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)
答案 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.nan
和np.inf
之类的数字默认使用0.0值,这可以使用cmap.set_bad()
更改,类似于上面的under和over。
最后,您可能需要对数据进行规范化,使其符合范围[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
对数标准化器(matplotlib.colors.LogNorm)也可用于具有大范围值的数据范围。
(感谢Joe Kington和tcaswell提供有关如何改进答案的建议。)
答案 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()
答案 3 :(得分:0)
要以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]))
答案 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