Python matplotlib 手动色彩映射

4 投票
2 回答
4431 浏览
提问于 2025-04-18 18:34

我在用Python的matplotlib库中的basemap来绘制二维数据。我的数据值从0到超过1000不等。我想知道能不能手动设置一个颜色映射表,让颜色和数值之间有固定的对应关系。这个颜色映射表应该像这样:

对于不同的数值,设置对应的颜色:

  • 0 - 1 - 白色
  • 1 - 5 - 深绿色
  • 5 - 10 - 浅绿色
  • 10 - 25 - 黄色
  • 25 - 50 - 棕色
  • 50 - 100 - 橙色
  • 100 - 500 - 浅红色
  • 500 - 1000 - 深红色
  • > 1000 - 紫色

我刚开始学Python,所以任何建议都很欢迎。

2 个回答

0

像这样应该可以工作:

from matplotlib import pyplot
from matplotlib.colors import LinearSegmentedColormap

def create_cmap(data, colours, stops=None):
    min_x = min(data)
    max_x = max(data)
    
    if stops is not None:
        min_x = min(min_x, min(stops))
        max_x = max(max_x, max(stops))
    
    if stops is None:
        d_x = (max_x - min_x)/(len(colours)-1)
        stops = [min_x + i*d_x for i in range(len(colours))]
    
    if min_x < min(stops):
        stops = [min_x] + stops
        colours = [colours[0]] + colours
        
    if max_x > max(stops):
        stops = stops + [max_x]
        colours = colours + [colours[-1]]
    
    stops = [(s-min_x)/(max_x-min_x) for s in stops]
    
    cmap_data = list(zip(stops, colours))
    cmap = LinearSegmentedColormap.from_list('continuous_map', cmap_data)
    
    def cmap_wrapper(x):
        x = max(min_x, min(x, max_x))
        x_n = (x-min_x)/(max_x-min_x)
        return cmap(x_n)
    
    return cmap_wrapper



colours = ['xkcd:white', 'xkcd:darkgreen', 'xkcd:lightgreen', 'xkcd:yellow', 'xkcd:brown', 'xkcd:orange', 'xkcd:coral', 'xkcd:crimson', 'xkcd:purple']
stops = [0, 1, 5, 10, 25, 50, 100, 500, 1000]

cmap = create_cmap(stops, colours, stops=stops)

fig = pyplot.figure(figsize=(10,10))
ax = fig.add_subplot(1,1,1)

for y in range(1000):
    ax.plot([0,1],[y,y],c=cmap(y))
    
pyplot.show()

在这里输入图片描述

7

这个正是你想要的。

不过,输入的方式有点让人困惑,所以这个可能会更有帮助。

要处理大于1000的部分,你需要把超过1000的值遮罩掉,然后让其余的范围从0到1000。

from matplotlib.colors import LinearSegmentedColormap
cMap = []
for value, colour in zip([0,1,5,10,25,50,100,500,1000],["White", "DarkGreen", "LightGreen", "Yellow", "Brown", "Orange", "IndianRed", "DarkRed", "Purple"]):
    cMap.append((value/1000.0, colour))

customColourMap = LinearSegmentedColormap.from_list("custom", cMap)

这就是你创建自定义颜色图所需的全部内容。使用时,只需将其作为命名参数cmap传入绘图函数(无论你用的是哪个函数)即可。

这就是它的样子。在这里输入图片描述

撰写回答