【问题标题】:Multiple Heatmap Subplots: Same Heatbar多个热图子图:相同的热线
【发布时间】:2016-02-12 17:43:42
【问题描述】:

这是我绘制热图的方式:

import matplotlib.pyplt as plt 

ax = plt.gca()
im = ax.imshow(values)
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size='5%', pad=0.05)
plt.colorbar(im, cax=cax)

现在我想创建一个 2x2 的子图,有 4 个不同的热图,并且都具有相同的热条。我对如何实现这一目标完全一无所知,并且希望能向正确的方向轻推。

【问题讨论】:

  • 不清楚你到底想要什么。具有 4x4 子图的图形将有 16 个子图,而不是 4 个。您的意思是 2x2 排列吗?为什么要使用相同的分隔线?它们应该都有相同的颜色条,还是 4(或 16)个单独的颜色条?
  • @tom 是的,2x2。它们都应该具有相同的颜色条,因为它们具有来自同一域的数字。因此也只有一个分隔符(否则会重复)。
  • @tom 也许我现在注意到了混乱。 “一个分隔线”是指用数字标记颜色的条形之一。也许那是颜色条 - 我认为它只是双射数 -> 颜色,而不是可视化。我现在正在检查是什么。
  • 是的,我想你的意思是一个颜色条。分隔符只是matplotlib 中的一种方法,用于帮助拆分轴(例如,添加颜色条)。请参阅我的答案,我认为它可以满足您的需求。

标签: python matplotlib heatmap


【解决方案1】:

您可以使用AxesGrid from mpl_toolkits.axes_grid1 执行此操作。请参阅示例 here(具体来说,请查看该示例中的函数 demo_grid_with_single_cbar)。

我稍微修改了该示例,以适用于右侧带有颜色条的 2x2 网格。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import AxesGrid

# Some random data
values1 = np.random.rand(10,10)
values2 = np.random.rand(10,10)
values3 = np.random.rand(10,10)
values4 = np.random.rand(10,10)
vals = [values1,values2,values3,values4]

fig = plt.figure()

grid = AxesGrid(fig, 111,
                nrows_ncols=(2, 2),
                axes_pad=0.05,
                share_all=True,
                label_mode="L",
                cbar_location="right",
                cbar_mode="single",
                )

for val, ax in zip(vals,grid):
    im = ax.imshow(val, vmin=0, vmax=1)

grid.cbar_axes[0].colorbar(im)

for cax in grid.cbar_axes:
    cax.toggle_label(False)

plt.show()

【讨论】:

  • 我认为这个答案是错误的,至少在较新版本的matplotlib中。如果我插入值 values1 = [[0.0, 0.1],[0.2, 0.3]] values2 = [[0.35, 0.36], [0.37, 0.38]] values3 = [[0.4, 0.5], [0.6, 0.7]] values4 = [[1.0, 0.9], [0.8, 0.75]] 在您的代码中(请注意,values4 中的最小值高于 values1 中的最大值),很明显热条仅属于最后一个图表:[![热点图][1]][1] [1]:i.stack.imgur.com/ARvl3.png
  • 既然你的回答被接受了……我应该再问这个问题吗?
  • 您只需在对imshow 的调用中添加vminvmax,以确保您的所有绘图都使用相同的缩放比例。这里的例子没有错,只是所有四个子图都有相同的最小值/最大值,因此与您的用例不同。
  • 感谢您的解释!但是,从技术上讲,这四个np.random.rand(10,10) 数组也不是一个规模的:)
猜你喜欢
  • 2021-09-18
  • 1970-01-01
  • 2017-11-26
  • 2015-10-26
  • 2020-10-12
  • 2016-07-30
  • 1970-01-01
  • 2018-07-27
  • 2020-02-10
相关资源
最近更新 更多