在 matplotlib 中调整单个子图的大小

Posted

技术标签:

【中文标题】在 matplotlib 中调整单个子图的大小【英文标题】:Resizing a single subplot in matplotlib 【发布时间】:2013-09-15 02:29:08 【问题描述】:

我在尝试调整 matplotlib 中的一个子图时遇到问题。基本上我有四个地块,我希望它的大小约为其他地块的 1.5 倍。

我在尝试为顶部子图提供图例时也遇到了麻烦。我希望它将每种颜色指定为 1、2、3、4 或 5(请参见图片)。

这是我的绘图功能代码

def plot_data(avg_rel_track, sd_rel_track_sum, sd_index, sd_grad):

    fig, (ax0, ax1, ax2, ax3) = plt.subplots(nrows=4, figsize=(15,10))
    fig.subplots_adjust(top=0.85)
    ax0.plot(avg_rel_track_nan)
    if len(sd_index)!=0:
        if len(sd_index)>1:
            for i in range(1, len(sd_index)):
                if sd_grad[i]==1:
                    ax0.axvspan(sd_index[i-1],sd_index[i], edgecolor='#FFCC66', facecolor='#FFCC66', alpha=1)
    #The following plot has 5 plots within it.
    ax0.set_title('Averaged Relative Track',fontsize=11)
    ax0.set_ylim(auto=True)

    ax1.plot(sd_rel_track_sum)
    ax1.set_title('RT Standard Deviation',fontsize=11)
    ax1.set_ylim([0,250])

    ax2.plot(splitpre)
    ax2.set_title('Track Split',fontsize=11)

    ax3.plot(ts_sd)
    ax3.set_title('Track Split Standard Dev',fontsize=11)
    ax3.set_ylim([0,100])

    fig.tight_layout()
    plt.show()

我正在努力寻找一种在不改变整个函数编写方式的情况下调整大小的方法。我似乎找不到“子图”的文档。

据我了解,您必须在情节中添加“标签”才能创建图例。但是,顶部子图的所有数据都是同时绘制的?

【问题讨论】:

什么是avg_rel_track_nan 它是一个“二维数组”,有五列和大约 963 行。图上的每一列对应不同的颜色线 【参考方案1】:

你可以使用matplotlib的gridspec模块:

import matplotlib.pyplot as plt
from matplotlib import gridspec

def plot_data(avg_rel_track, sd_rel_track_sum, sd_index, sd_grad):

    fig = plt.figure(figsize=(15,10))
    gs  = gridspec.GridSpec(4, 1, height_ratios=[1, 1 ,1.5, 1])
    ax0 = plt.subplot(gs[0])
    ax1 = plt.subplot(gs[1])
    ax2 = plt.subplot(gs[2])
    ax3 = plt.subplot(gs[3])

    fig.subplots_adjust(top=0.85)
    lineObjects = ax0.plot(avg_rel_track_nan)

    if len(sd_index)>1:
        for i in xrange(1, len(sd_index)):
            if sd_grad[i]==1:
                ax0.axvspan(sd_index[i-1], sd_index[i],
                            edgecolor='#FFCC66', facecolor='#FFCC66',
                            alpha=1)

    #The following plot has 5 plots within it.
    ax0.set_title('Averaged Relative Track',fontsize=11)
    ax0.legend(lineObjects, (1,2,3,4,5))

    ax1.plot(sd_rel_track_sum)
    ax1.set_title('RT Standard Deviation',fontsize=11)
    ax1.set_ylim([0,250])

    ax2.plot(splitpre)
    ax2.set_title('Track Split',fontsize=11)

    ax3.plot(ts_sd)
    ax3.set_title('Track Split Standard Dev',fontsize=11)
    ax3.set_ylim([0,100])

    fig.tight_layout()
    plt.show()

【讨论】:

非常感谢!出于好奇,我只是想知道为什么您将 sd_rel_track_sum 乘以 200? @AshleighClayton 啊,那是我在测试时使用的东西,不应该包含在代码中。好收获!

以上是关于在 matplotlib 中调整单个子图的大小的主要内容,如果未能解决你的问题,请参考以下文章

在 matplotlib 中设置子图的大小

更改 matplotlib 子图的大小

matplotlib 子图的行标题

python+matplotlib绘制具有多个子图的图表

python+matplotlib绘制具有多个子图的图表

python+matplotlib绘制具有多个子图的图表