如果给出色图名称BoundryNorm和' c ='?如何获得matplotlib rgb颜色?

时间:2014-09-29 20:37:59

标签: python matplotlib rgb colormap

如何获取数字NUM的matplotlib rgb值,给定:

  1. 色彩图('autumn_r'在下面的例子中为黄色到红色)
  2. BoundryNorm值(以下示例中的“2到10”)
  3. 数字NUM
  4. 在我的例子中,我想:

    1. 给定2或更小的值,返回黄色的rgb值。
    2. 给定任何值10或更多,返回红色的rgb值。
    3. 给定范围3 <= NUM​​ <= 9的值,将从指定的色彩映射中选择黄色和红色之间的颜色
    4. 下面的代码显示了colormap的用法并定义了我的边界值。现在我只需要一个函数来返回我的rgb值而不是散点图。散点图仅用于可视化,因此我可以看到规范化正如我所希望的那样工作。

      import matplotlib.pyplot as plt
      import matplotlib as mpl
      from matplotlib import cm
      import numpy as np
      import copy
      
      # setup the plot
      fig, ax = plt.subplots(1,1, figsize=(6,6))
      
      # define the data
      NUM_VALS = 20
      NORM_ENDS = (2,10)
      x = np.random.uniform(0, NUM_VALS, size=NUM_VALS)
      y = np.random.uniform(0, NUM_VALS, size=NUM_VALS)
      tag = copy.deepcopy(y)
      
      # define the colormap
      cmap = plt.get_cmap('autumn_r')
      cmaplist = [cmap(i) for i in range(cmap.N)]
      
      # create the new map
      cmap = cmap.from_list('Custom cmap', cmaplist[0:], cmap.N)
      
      # define the bins and normalize
      bounds = np.linspace(NORM_ENDS[0], NORM_ENDS[1], NORM_ENDS[1]-NORM_ENDS[0]+1)
      norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
      
      # make the scatter
      scat = ax.scatter(x,y,s=300, c=tag,cmap=cmap,norm=norm)
      
      # create a second axes for the colorbar
      ax2 = fig.add_axes([0.90, 0.1, 0.03, 0.8])
      cb = mpl.colorbar.ColorbarBase(ax2, cmap=cmap, norm=norm, spacing='proportional', ticks=bounds, boundaries=bounds, format='%1i')
      
      ax.set_title('Well defined discrete colors')
      ax2.set_ylabel('Very custom cbar [-]', size=12)
      
      plt.show()
      

3 个答案:

答案 0 :(得分:10)

知道了。我创建了一个包含“get_rgb”函数的colormap辅助对象:

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

class MplColorHelper:

  def __init__(self, cmap_name, start_val, stop_val):
    self.cmap_name = cmap_name
    self.cmap = plt.get_cmap(cmap_name)
    self.norm = mpl.colors.Normalize(vmin=start_val, vmax=stop_val)
    self.scalarMap = cm.ScalarMappable(norm=self.norm, cmap=self.cmap)

  def get_rgb(self, val):
    return self.scalarMap.to_rgba(val)

示例用法:

import numpy as np
# setup the plot
fig, ax = plt.subplots(1,1, figsize=(6,6))

# define the data between 0 and 20
NUM_VALS = 20
x = np.random.uniform(0, NUM_VALS, size=NUM_VALS)
y = np.random.uniform(0, NUM_VALS, size=NUM_VALS)

# define the color chart between 2 and 10 using the 'autumn_r' colormap, so
#   y <= 2  is yellow
#   y >= 10 is red
#   2 < y < 10 is between from yellow to red, according to its value
COL = MplColorHelper('autumn_r', 2, 10)

scat = ax.scatter(x,y,s=300, c=COL.get_rgb(y))
ax.set_title('Well defined discrete colors')
plt.show()

答案 1 :(得分:3)

这就足够了。

In [22]:

def cstm_autumn_r(x):
    return plt.cm.autumn_r((np.clip(x,2,10)-2)/8.)
In [23]:

cstm_autumn_r(1.4)
Out[23]:
(1.0, 1.0, 0.0, 1.0) #rgba yellow
In [24]:

cstm_autumn_r(10.5) #rgba red
Out[24]:
(1.0, 0.0, 0.0, 1.0)
In [25]:

%matplotlib inline
x = np.linspace(0, 15)
plt.scatter(x,x, c=cstm_autumn_r(x))

enter image description here

答案 2 :(得分:0)

cmap = plt.get_cmap(cmap_name)
rgb_cm = cmap.colors  # returns array-like color