前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多张热图的排版技巧

多张热图的排版技巧

作者头像
生信修炼手册
发布2020-09-28 11:08:06
1.6K0
发布2020-09-28 11:08:06
举报
文章被收录于专栏:生信修炼手册生信修炼手册

欢迎关注”生信修炼手册”!

当我们想要在一幅图中展示多个热图时,采用传统的一页多图的方式,会导致排版的混乱,第一个例子,同时展示两幅热图以及对应的图例,代码如下

代码语言:javascript
复制
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> np.random.seed(123456789)
>>> data = np.random.rand(25).reshape(5, 5)
>>> fig, (ax1, ax2) = plt.subplots(1, 2)
>>> im1 = ax1.imshow(data)
>>> im2 = ax2.imshow(data)
>>> plt.colorbar(im1, ax=ax1)
<matplotlib.colorbar.Colorbar object at 0x08C62490>
>>> plt.colorbar(im2, ax=ax2)
<matplotlib.colorbar.Colorbar object at 0x08C8B3A0>
>>> plt.show()

输出结果如下

可以看到,默认的宽高比情况下,图例的高度大大超过了热图的高度,这种情况相下,可以通过调节figure的宽高比来使得图形显示比例正常。第二个例子,还是显示两幅热图,但是这显示一个图例,代码如下

代码语言:javascript
复制
>>> fig, (ax1, ax2) = plt.subplots(1, 2)
>>> im1 = ax1.imshow(data)
>>> im2 = ax2.imshow(data)
>>> plt.colorbar(im2, ax=ax2)
<matplotlib.colorbar.Colorbar object at 0x0A0AB670>
>>> plt.show()

输出结果如下

此时排版同样很混乱,而且无法通过简单的调整输出图像的宽高比来解决问题。

对于多副热图的排版问题,在matplotlib中,可以通过ImageGrid方法来调节。在该方法中,支持以下两种图例显示模式

1. single

只显示一个图例,代码如下

代码语言:javascript
复制
>>> fig = plt.figure()
>>> grid = ImageGrid(fig, rect=(0.05,0.05,0.8,0.8),nrows_ncols=(1, 2), axes_pad=0.25, label_mode="1", cbar_location="right", cbar_mode="single")
>>> for ax in grid:
... im = ax.imshow(data)
...
>>> grid.cbar_axes[0].colorbar(im)
<matplotlib.colorbar.Colorbar object at 0x00F7A268>
>>> plt.show()

输出结果如下

2. each

每副热图对应一个图例,代码如下

代码语言:javascript
复制
>>> fig = plt.figure()
>>> grid = ImageGrid(fig, rect=(0.05,0.05,0.8,0.8),nrows_ncols=(1, 2), axes_pad=0.5, label_mode="1", cbar_location="right", cbar_mode="each", cbar_pad="3%")
>>> for ax, cax in zip(grid, grid.cbar_axes):
... im = ax.imshow(data)
... cax.colorbar(im)
...
<matplotlib.colorbar.Colorbar object at 0x08C405C8>
<matplotlib.colorbar.Colorbar object at 0x08C40C70>
>>> plt.show()

输出结果如下

通过ImageGrid,不仅可以解决图例的排版问题,还可以排版多副大小不一的热图,代码如下

代码语言:javascript
复制
>>> data1 = np.random.rand(50).reshape(5, 10)
>>> data2 = np.random.rand(30).reshape(5, 6)
>>> data3 = np.random.rand(20).reshape(5, 4)
>>> fig = plt.figure()
>>> grid = ImageGrid(fig, rect=(0.05,0.05,0.8,0.8),nrows_ncols=(1, 3), axes_pad=0.25, label_mode="1", cbar_location="right", cbar_mode="single", cbar_pad="3%")
>>> for ax, data in zip(grid, [data1, data2, data3]):
... im = ax.imshow(data)
...
>>> grid.cbar_axes[0].colorbar(im)
<matplotlib.colorbar.Colorbar object at 0x08BAB1D8>
>>> plt.show()

输出结果如下

对于多副热图的排版而言,通过ImageGrid可以大大提高处理的简便性。

·end·

—如果喜欢,快分享给你的朋友们吧—

原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信修炼手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档