numpy 从色彩Map表中为“n”个数字获取“n”个等距RGB颜色

35g0bw71  于 2024-01-08  发布在  其他
关注(0)|答案(2)|浏览(154)

我有一个数字列表,想从python中的ylorbr颜色表中为每个数字分配一个颜色。如果我对颜色表的直觉是正确的,它只是一个颜色范围-所以,ylorbr从黄色到橙子再到棕色。
我只想从这个色彩Map表中得到n等间距的颜色元组,从0开始(在本例中,是黄色)。
这是我尝试过的简单代码:

  1. from matplotlib import cm
  2. import numpy as np
  3. ylorbr = cm.get_cmap('YlOrBr', 8)
  4. x = ylorbr(np.arange(0,1,0.1))
  5. print(x)

字符串
当我尝试这个时,x不是一组均匀间隔的颜色-事实上,颜色是重复的。我也找不到其他的解决方案-或者可能有,但我是新的绘图。
我是绘图新手,但对python并不陌生。有什么原因吗?为什么从给定的色彩Map表中获得一个简单的均匀间隔的RGB列表很难?我使用“python sense”做了上面的测试,实际上期望得到一个均匀间隔的RGB元组列表。
有人能告诉我python中的colormap是如何工作的吗?以及如何以最短的方式将n排序的整数分配给colormap中的n颜色?
编辑:这里我假设colormap是一个离散的颜色列表,我只需要第一个元素,最后一个元素和每个元素的颜色列表的1/n。
编辑2:根据Mark下面的评论,我尝试在get_cmap之后使用.colors属性访问Map的颜色列表。但是当颜色Map表为viridis时,它可以工作,当我将其设置为YlOrBr时,它不工作,我得到错误:'LinearSegmentedColormap' object has no attribute 'colors'

f0ofjuux

f0ofjuux1#

你让它做一个有8个条目的色图,当你要求10个结果时,你得到重复的结果也就不足为奇了。
我在这都能听到你尖叫。

9njqaruj

9njqaruj2#

色彩Map表有一个resampled函数,关于你想要什么
(but在RGB空间插值可以给予你难看的颜色,让色彩鉴赏家哭泣)

  1. #!/usr/bin/env python3
  2. import numpy as np
  3. import matplotlib.pyplot as pl
  4. from matplotlib.colors import Colormap, ListedColormap, LinearSegmentedColormap # ? in ipython
  5. def cmaparray( cmap: Colormap ) -> "N x 3 rgb array":
  6. # only ListedColormap has .colors, this works for both Listed and Linseg
  7. return cmap( np.linspace( 0, 1, cmap.N )) [:,:3]
  8. def printcmap( cmap: Colormap ):
  9. print( f"{cmap.name} len {cmap.N}:" )
  10. print( cmaparray( cmap ).T, "\n" )
  11. #...............................................................................
  12. if __name__ == "__main__":
  13. np.set_printoptions( precision=2 )
  14. print( 80 * "▄" )
  15. cmapname = "YlOrBr" # Linseg
  16. # cmapname = "viridis" # ListedColormap
  17. nin = 8
  18. nout = 10
  19. print( f"params: {cmapname = } {nin = } {nout = } \n" )
  20. cmap = pl.get_cmap( cmapname, nin ) # ListedColormap / LinearSegmentedColormap
  21. printcmap( cmap )
  22. sample = cmap.resampled( nout ) # does np.interp ? no dups
  23. sample.name = "sample"
  24. printcmap( sample )

字符串

展开查看全部

相关问题