使用Matplotlib/Python显示带有透明度的“热图”图像

1 投票
2 回答
2580 浏览
提问于 2025-04-17 22:40

我正在尝试绘制一些数据来进行分析。

我的数据定义如下:

class Data(object):
    def __init__(self, rows=200, cols=300):
        """
        The Data constructor
        """
        # The data grid
        self.cols = cols
        self.rows = rows
        # The 2D data structure
        self.data = numpy.zeros((rows, cols), float)

一开始,我使用了这个方法:

  def generate_data_heat_map(data, x_axis_label, y_axis_label, plot_title, file_path):
    plt.figure()
    plt.title(plot_title)
    fig = plt.imshow(data.data, extent=[0, data.cols, data.rows, 0])
    plt.xlabel(x_axis_label)
    plt.ylabel(y_axis_label)
    plt.colorbar(fig)
    plt.savefig(file_path + '.png')
    plt.close()

这个方法给了我一个热图的效果(第二张图),因为我传入的是一个MxN的[亮度(灰度,只有浮点数组)]。我不知道为什么这没有生成灰度图,但到目前为止我并没有太在意,因为这是我想要的结果。

经过一些计算后,我有了这个方法来可视化我的数据,使用data_property作为RGB,data_uncertaity作为透明度:

def generate_data_uncertainty_heat_map(data_property, data_uncertainty, x_axis_label, y_axis_label, plot_title, file_path):
    plt.figure()
    uncertainty = numpy.zeros((data_property.rows, data_property.cols, 4))
    uncertainty[..., :3] = data_property.data[..., numpy.newaxis]
    uncertainty[..., 3] = data_uncertainty.data
    plt.title(plot_title)
    fig = plt.imshow(uncertainty.data, extent=[0, data_property.cols, data_property.rows, 0])
    plt.xlabel(x_axis_label)
    plt.ylabel(y_axis_label)
    plt.colorbar(fig)
    plt.savefig(file_path + '.png')
    plt.close()

当然,这样得到的图是灰度图,带有透明度值,因为我对红、绿、蓝的值都是重复的。但我真正想要的是第一种方法的结果(有颜色的),同时带有根据数据的不确定性计算出的透明度值。

在这里输入图片描述

我注意到我的颜色条也没有显示我的数据(它是RGB的,我不能用它来分析我的数据)

我不知道怎么才能得到我想要的结果,也就是有一个“热图”,并且将用我的uncertainty_data定义的透明度值合并在一起,同时有一个表示这种不确定性的颜色条。就像合并上面这两张图:

这是我的颜色: 图2

这是我的透明度: 在这里输入图片描述

根据@BlazBratanic提供的转换,我想我能看到一点颜色(不太确定),但远远没有达到我的预期。

在这里输入图片描述

我的所有值都在0.0到1.0之间。

提前谢谢你。

2 个回答

0

如果我理解这个问题没错的话,按照我现在用的matplotlib版本(3.7.1),我可以直接使用一个叫做alpha的参数,它可以接受二维数组。所以可以这样写:

plt.imshow(data_array, ... ,alpha = alpha_array)

一个最小可运行示例(MWE)可以是:

import numpy
import matplotlib.pyplot as plt

mat = numpy.zeros((150,150))
mat[:,3] = 1
mat[:,45] = 1 #two vertical lines

counts = numpy.tile(numpy.array(list(range(1,151))).reshape(-1,1),[1,150])
counts = counts/numpy.max(counts) # alpha that increases linearly

plt.imshow(mat, cmap = 'binary', alpha = counts)
plt.show()
1

使用 Matplotlib 的 cm 模块 可以把你的灰度值转换成颜色值。如果我没记错的话,“jet”是默认的颜色映射方案。所以你可以这样做:

uncertainty = plt.cm.jet(data_property.data)
uncertainty[..., 3] = data_uncertainty.data

撰写回答