ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-在倾斜的网格中排列matplotlib子图

2019-11-11 04:57:52  阅读:289  来源: 互联网

标签:subplot matplotlib python


使用matplotlib,我想在每行具有不同列数的网格上显示多个子图,其中每个子图的大小大致相同,并且子图的排列方式使它们或多或少居中,如下所示:

Grid of axes in pattern (2, 3, 2)

创建具有2、3、2模式的带有gridspec的网格是一件相当简单的事情,但是问题在于,网格规范毫无疑问地将它们与网格对齐,因此行中具有2个图的图更宽:

Grid aligned with gridspec

这是生成该代码的代码:

from matplotlib import gridspec
from matplotlib import pyplot as plt

fig = plt.figure()

arrangement = (2, 3, 2)
nrows = len(arrangement)

gs = gridspec.GridSpec(nrows, 1)
ax_specs = []
for r, ncols in enumerate(arrangement):
    gs_row = gridspec.GridSpecFromSubplotSpec(1, ncols, subplot_spec=gs[r])
    for col in range(ncols):
        ax = plt.Subplot(fig, gs_row[col])
        fig.add_subplot(ax)

for i, ax in enumerate(fig.axes):
    ax.text(0.5, 0.5, "Axis: {}".format(i), fontweight='bold',
            va="center", ha="center")
    ax.tick_params(axis='both', bottom='off', top='off', left='off',
                   right='off', labelbottom='off', labelleft='off')

plt.tight_layout()

我知道我可以建立一堆子图并通过计算它的几何形状来调整它们的排列,但是我认为它可能会变得有些复杂,所以我希望可以有一个更简单的方法.

我应该注意,即使我使用(2,3,2)排列作为示例,我也想对任意集合执行此操作,而不仅仅是此集合.

解决方法:

通常的想法是找到子图之间的公共分母,即所需网格可以组成的最大子图,并将所有子图跨越其中的几个子图,以实现所需的布局.

enter image description here

在这里,您有3行和6列,每个子图跨越1行和两列,只是第一行中的子图跨越子图位置1/2和3/4,而第二行中的子图跨越位置0/1,2 / 3,4/5.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

gs = gridspec.GridSpec(3, 6)
ax1a = plt.subplot(gs[0, 1:3])
ax1b = plt.subplot(gs[0, 3:5])
ax2a = plt.subplot(gs[1, :2])
ax2b = plt.subplot(gs[1, 2:4])
ax2c = plt.subplot(gs[1, 4:])
ax3a = plt.subplot(gs[2, 1:3])
ax3b = plt.subplot(gs[2, 3:5])


for i, ax in enumerate(plt.gcf().axes):
    ax.text(0.5, 0.5, "Axis: {}".format(i), fontweight='bold',
            va="center", ha="center")
    ax.tick_params(axis='both', bottom='off', top='off', left='off',
                   right='off', labelbottom='off', labelleft='off')

plt.tight_layout()

plt.show()

enter image description here

标签:subplot,matplotlib,python
来源: https://codeday.me/bug/20191111/2017389.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有