当前位置: 首页 > 知识库问答 >
问题:

Matplotlib-将子地块添加到子地块?

昝晗昱
2023-03-14

我试图创建一个由2x2网格组成的图形,其中每个象限有两个垂直堆叠的子图(即2x1网格)。不过,我似乎不知道如何实现这一点。

我得到的最接近的是使用gridspec和一些丑陋的代码(见下文),但是因为gridspec.update(hspace=X)改变了所有子图的行间距,所以我仍然不在我想去的地方。

理想情况下,我想要的是,以下图为例,减少每个象限内子地块之间的间距,同时增加顶部和底部象限之间的垂直间距(即1-3和2-4之间)。

有没有办法做到这一点(使用或不使用gridspec)?我最初的设想是生成每个子图网格(即每个2x1网格)并将它们插入到更大的2x2子图网格中,但我还没有弄清楚如何将子图添加到子图中,如果有办法的话。

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(4,2)
gs.update(hspace=0.4)
for i in range(2):
    for j in range(4):
        ax = plt.subplot(gs[j,i])
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        plt.tick_params(which='both', top='off', right='off')
        if j % 2 == 0:
            ax.set_title(str(i+j+1))
            ax.plot([1,2,3], [1,2,3])
            ax.spines['bottom'].set_visible(False)
            ax.get_xaxis().set_visible(False)   
        else:
            ax.plot([1,2,3], [3,2,1])

共有3个答案

汪臻
2023-03-14

由于我不得不依赖Suever的答案,但不得不根据自己的需要对其进行修改,因此我认为,如果有人觉得有帮助,我可能会做出贡献:

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

channelArrangement = [16, 17, 18 , 19 , 22, 25, 28 , 29 , 31]

fig = plt.figure(figsize=(10, 8))
outer = gridspec.GridSpec(1, 2, wspace=0.2, hspace=0.2)

for i in range(2):
    inner = gridspec.GridSpecFromSubplotSpec(3, 3, subplot_spec=outer[i],
                                             wspace=0.1, hspace=0.1)
    row     = 0
    col     = 0
    maxCol  = 3

    for chan in channelArrangement:
        ax = plt.Subplot(fig, inner[row,col])
        t= ax.text(0.5,0.5, 'outer=%d\nrow=%d\ncol=%d' % (i,row,col))
        ax.set_xticks([])
        ax.set_yticks([])
        t.set_ha('center')
        fig.add_subplot(ax)
        col += 1
        if col == maxCol:
            col = 0
            row += 1
plt.show()
漆雕修德
2023-03-14

您现在可以使用figure.subfigure嵌套子情节:https://matplotlib.org/stable/gallery/subplots_axes_and_figures/subfigures.html

您还可能会发现subplot\u mosaic很有用,因为它支持嵌套:https://matplotlib.org/stable/tutorials/provisional/mosaic.html

虽然嵌套总是有点痛苦,但可以说这两种方法都使过程更容易、更灵活。

摘自上述示例:

import matplotlib.pyplot as plt

fig = plt.figure(constrained_layout=True)

subfigs = fig.subfigures(2, 2)

for outerind, subfig in enumerate(subfigs.flat):
    subfig.suptitle(f'Subfig {outerind}')
    axs = subfig.subplots(2, 1)
    for innerind, ax in enumerate(axs.flat):
        ax.set_title(f'outer={outerind}, inner={innerind}', fontsize='small')
        ax.set_xticks([])
        ax.set_yticks([])
 
plt.show()
冯和硕
2023-03-14

您可以使用SubplotSpec嵌套您的GridSpec。外部网格将是2 x 2,内部网格将是2 x 1。下面的代码应该会给你基本的想法。

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

fig = plt.figure(figsize=(10, 8))
outer = gridspec.GridSpec(2, 2, wspace=0.2, hspace=0.2)

for i in range(4):
    inner = gridspec.GridSpecFromSubplotSpec(2, 1,
                    subplot_spec=outer[i], wspace=0.1, hspace=0.1)

    for j in range(2):
        ax = plt.Subplot(fig, inner[j])
        t = ax.text(0.5,0.5, 'outer=%d, inner=%d' % (i, j))
        t.set_ha('center')
        ax.set_xticks([])
        ax.set_yticks([])
        fig.add_subplot(ax)

fig.show()
 类似资料:
  • 我想问你一个关于matplotlib中的子批大小的问题。我需要创建一个固定大小的图形,由一行中的3个子地块组成。出于“编辑原因”,我需要确定图形的大小,但我也想确定子地块的大小和位置,而不影响图形大小(第三个子地块必须比前两个子地块窄)。 我尝试使用GridSpec,但没有成功。我还尝试使用“figsize”来固定图形大小,并为子地块使用add\u轴,但根据子地块的相对大小,图形和子地块的总体大小

  • 我想以无原子锁的方式使用ConcurrentLinkedQueue: 几个并发线程将事件推送到队列中,其他一些线程将处理它们。队列没有绑定,我不希望任何线程等待或被锁定。然而,阅读部分可能会注意到队列变空了。在无锁实现中,读取线程不能阻塞,只能结束其任务并继续执行其他任务(即作为ExecutorService)。因此,将第一个新事件推送到空队列中的写入程序必须知道它,并且应该重新启动读取器(即,通

  • 在Matplotlib中创建子地块数组时,有没有一种方法可以完全去掉勾号标签?我目前需要根据绘图对应的较大数据集的行和列指定每个绘图。我尝试使用ax.setxticks([])和类似的y轴命令,但没有成功。 我认识到,这可能是一个不寻常的要求,希望作出一个绘图没有轴数据,但这是我需要的。我需要它自动应用于数组中的所有子地块。

  • 我有一个数据框架,df,就像: 我想绘制两个垂直条形图,每个大陆一个,并排,共享相同的y轴。我已经完成了90%的工作,除了将条的高度添加到子图中。到目前为止,我的代码: 我在这里和那里看到过带有标签的示例,但这些往往只适用于一个条形图,而不是几个子图。

  • 问题内容: 我希望降低不同子地块上的刻度标签密度 结果呢![输入图像描述] 这里 我想减少上面两个子地块的记号标签。怎么做 ? 谢谢。 奖励:1)如何去除条形图上y=0的虚线? 2) 如何去除子图0和1之间的x-trick标签?3) 如何设置 后面的情节要透明吗?(请参见右下角断开的y轴线。) 消失在情节背后) 问题答案: 您可以像设置xticks一样,将记号设置到您想要的位置。 这将为ax0子批

  • 问题内容: 我正在寻找有关如何在熊猫df.hist()命令生成的直方图图的顶部显示标题的建议。例如,在下面的代码生成的直方图图形块中,我想在图形的顶部放置一个常规标题(例如“我的直方图集合”): 我试过在hist命令中使用 title 关键字(即title =’我的直方图集合)’,但这没用。 以下代码通过在其中一个轴上添加文本来 实现 工作(在ipython笔记本中),但有点麻烦。 有没有更好的办