如何让多个热图在全息视图中共享轴?

问题描述 投票:0回答:1

我正在创建两个具有不同数据范围的热图。我想将它们以相同的范围绘制在一起,并根据需要添加空单元格以使它们具有相同的大小。这是两个示例热图的代码:

import random
import holoviews as hv
hv.extension("matplotlib")

data1 = [(x, y, random.random()) for x in range(3) for y in range(6)]
data2 = [(x, y, random.random() * 3) for x in range(7) for y in range(2)]
hmap1 = hv.HeatMap(data1)
hmap2 = hv.HeatMap(data2)
combined = (hmap1 + hmap2).opts(hv.opts.HeatMap(show_values=False, colorbar=True))

呈现为

enter image description here

一张较高的热图和一张较宽的热图。在这个例子中我希望它们都是 7x6。我尝试做

combined.opts(shared_axes=True)
,但结果是一样的。执行
hmap1.redim.values(x=[0, 1, 2, 3, 4, 5, 6])
也会产生相同的情节。

如何调整多个(不一定只是两个)热图的大小以使用相同的网格将它们绘制在一起?

python visualization holoviews
1个回答
0
投票

这有点hacky,但我发现最好的方法是从扩展数据创建新的热图,仅使用 NaN 作为空值。这是执行此操作的快速函数:

import random

import holoviews as hv
import pandas as pd

hv.extension("matplotlib")

data1 = [(x, y, random.random()) for x in range(3) for y in range(6)]
data2 = [(x, y, random.random() * 3) for x in range(7) for y in range(2)]
hmap1 = hv.HeatMap(data1)
hmap2 = hv.HeatMap(data2)

def combine_hmaps(*hmaps: hv.HeatMap) -> list[hv.HeatMap]:
    all_xys = set()
    for hmap in hmaps:
        all_xys.update(tuple(xy) for xy in hmap.data.iloc[:, :2].values)
    
    new_hmaps = []
    for hmap in hmaps:
        xys = {tuple(xy) for xy in hmap.data.iloc[:, :2].values}
        df = pd.DataFrame([(x, y, float("nan")) for x, y in all_xys - xys], columns=hmap.data.columns)
        new_hmaps.append(hv.HeatMap(pd.concat([hmap.data, df])))
    return new_hmaps


combined_hmaps = combine_hmaps(hmap1, hmap2)
hv.Layout(combined_hmaps).opts(hv.opts.HeatMap(show_values=False, colorbar=True))

这给了

enter image description here

可能有一种更漂亮的方法可以更好地使用

pandas
来做到这一点,但如果有人有一个不需要修改数据/制作新热图而只需要使用 Holoviews 选项的解决方案,我会特别感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.