我正在创建两个具有不同数据范围的热图。我想将它们以相同的范围绘制在一起,并根据需要添加空单元格以使它们具有相同的大小。这是两个示例热图的代码:
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))
呈现为
一张较高的热图和一张较宽的热图。在这个例子中我希望它们都是 7x6。我尝试做
combined.opts(shared_axes=True)
,但结果是一样的。执行 hmap1.redim.values(x=[0, 1, 2, 3, 4, 5, 6])
也会产生相同的情节。
如何调整多个(不一定只是两个)热图的大小以使用相同的网格将它们绘制在一起?
这有点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))
这给了
可能有一种更漂亮的方法可以更好地使用
pandas
来做到这一点,但如果有人有一个不需要修改数据/制作新热图而只需要使用 Holoviews 选项的解决方案,我会特别感兴趣。