Matplotlib pcolormesh,分离数据颜色和亮度信息

0 投票
1 回答
707 浏览
提问于 2025-04-18 08:21

我想用matplotlib在网格上绘制数据,目前我正在尝试使用pcolormesh。数据被组织成两个numpy数组,一个是数据本身,另一个是颜色信息数组。

下面的代码绘制了数据数组(1的部分是红色,0的部分是蓝色),但是我还有一个颜色信息数组,它应该根据每个对应的单元格的值来改变亮度,同时保持颜色不变。

举个例子,数据中的这一行[1, 0, 0, 1]应该应用亮度值[0.1, 0.12, 0.02, 0.01],这样在绘图时,这一行就会显示为[红色和亮度0.1,蓝色和亮度0.12,蓝色和亮度0.02,红色和亮度0.01]。

我该怎么做呢?

import numpy as np
import matplotlib.pyplot as plt

data = np.array([[1, 0, 0, 1], 
                 [0, 0, 1, 1], 
                 [0, 0, 0, 1]])
colorInformation = np.array([[0.1, 0.12, 0.02, 0.01], 
                             [0.12, 0.15, 0.18, 0.2], 
                             [0.3, 0.34, 0.41, 0.32]])

fig, ax = plt.subplots()
heatmap = ax.pcolormesh(data)
plt.show()

1 个回答

2

我建议你自己制作一个定制的颜色映射来解决这个问题。

from matplotlib.colors import LinearSegmentedColormap
data = np.array([[1, 0, 0, 1], 
                 [0, 0, 1, 1], 
                 [0, 0, 0, 1]])
colorInformation = np.array([[0.1, 0.12, 0.02, 0.01], 
                             [0.12, 0.15, 0.18, 0.2], 
                             [0.3, 0.34, 0.41, 0.32]])
alpha_up=abs(((data*2-1)*colorInformation).max())
alpha_low=abs(((data*2-1)*colorInformation).min())
mid=alpha_low/(alpha_up+alpha_low)
cdict1 = {'red':   ((0.0, 1.0, 1.0),
                   (mid, 1.0, 0.0),
                   (1.0, 0.0, 0.0)),

         'green': ((0.0, 0.0, 0.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 0.0),
                   (mid, 0.0, 1.0),
                   (1.0, 1.0, 1.0)),

         'alpha':  ((0.0, alpha_low, alpha_low),
                   (mid, 0.0, 0.0),
                   (1.0, alpha_up, alpha_up))
        }
red_blue = LinearSegmentedColormap('red_blue', cdict1)
fig, ax = plt.subplots()
heatmap = ax.pcolormesh((data*2-1)*colorInformation, cmap=red_blue)

在这里输入图片描述

或者你可以直接改变红色和蓝色,不使用透明度通道。

撰写回答