繁体   English   中英

在Python matplotlib中生成用户定义的色彩映射表

[英]Generating user-defined colormap in Python matplotlib

这是我的问题。

当我想要使用大量的色彩图时,我可以使用

CMAP = ["summer_r", "brg_r", "Dark2", "prism", "PuOr_r", "afmhot_r", "terrain_r", "PuBuGn_r", "RdPu", \
        "gist_ncar_r", "gist_yarg_r", "Dark2_r", "YlGnBu", "RdYlBu", "hot_r"]
## value was a 3-d array, the first dimension represent the amount of 2-d array with the value (0, 1).     
## I just plot the value 1 for each value[i,:,:]
for i in range(0,len(CMAP),1):
    plt.pcolor(xx,yy,value[i,:,:], cmap = CMAP[i])      

我可以得到这个:

http://i8.tietuku.com/cdcdcd5f539c124b.png

但是我无法清楚地意识到每个网格的颜色都会产生这个数字。
因为我在CMAP中添加的某些色彩映射可能具有相同的起始颜色。 因此,某些值[i,:,]网格很难区分。

我的点子

改为使用一个色图,并为每个值[i,:,]分割成单色。 因此,每个值网格都有不同的颜色。

例如:

## 1. cut the colormap, take "jet" for example      
cMap = plt.cm.get_cmap("jet",lut=6)      

http://i4.tietuku.com/be127c44e87a03fc.png

## 2. I havn't figured it out     
## This is the fake code 
CMAP = Func[one color -> colormap](cMap)    

更新-2016-01-18

这是我设置不同cmap和循环的代码,但它有点僵硬。

cmap1 = colors.ListedColormap(["w",'red'])
cmap2 = colors.ListedColormap(["w",'blue'])
cmap3 = colors.ListedColormap(["w",'yellow'])    

CMAP = [cmap1,cmap2,cmap3] 

然后,我可以应付我最初的尝试。

但我想知道是否有一种智能的方法来生成cmap1,cmap2,......?

其中最难的部分是N独特的颜色。 在实践中,只要N很小,通常最容易抓取随机颜色。 如果您更喜欢获得N不同颜色的更好方法,请查看seabornhusl_palettehsl_palette是如何实现的。 他们在HSL / HUSL空间中选择N均匀间隔的颜色并将其转换回RGB。

无论如何,在matplotlib中将特定值绑定到特定颜色有两个部分。 一个是色彩图,另一个是常态。 Normalize实例(标准)处理将数据范围转换为色彩映射的0-1空间。

有一个函数可以matplotlib.colors.from_levels_and_colors这个用例: matplotlib.colors.from_levels_and_colors 它返回一个cmapnorm实例,您可以将其传递给imshow / pcolormesh / scatter / pcolormesh

作为一个独立的例子,让我们生成具有随机数量的唯一整数值​​的数据。 我们将使用随机的柔和色彩,而不是尝试做一些奇特的事情。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import from_levels_and_colors

nvals = np.random.randint(2, 20)
data = np.random.randint(0, nvals, (10, 10))

colors = np.random.random((nvals, 3))
# Make the colors pastels...
colors = colors / 2.5 + 0.55

levels = np.arange(nvals + 1) - 0.5
cmap, norm = from_levels_and_colors(levels, colors)

fig, ax = plt.subplots()
im = ax.imshow(data, interpolation='nearest', cmap=cmap, norm=norm)
fig.colorbar(im, ticks=np.arange(nvals))
plt.show()

在此输入图像描述

不是最漂亮的调色板,但它并不可怕。 这是另一个运行:

在此输入图像描述

即使有17个值,我们仍然可以通过选择随机值获得相当明显的颜色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM