【问题标题】:Subplots size/tick spacing pyplot子图大小/刻度间距 pyplot
【发布时间】:2020-02-06 13:57:47
【问题描述】:

我已经搜索了类似的问题,但没有发现任何问题,所以我很抱歉。

我有这个:

import matplotlib.pyplot as plt

yearlymean_gm = np.load('ts_globalmean_annualmean.npz')
ts = yearlymean_gm['ts_aqct']

time = np.arange(0., 45 , 1)
plt.figure( figsize=(12, 5), dpi=80, facecolor='w', edgecolor='k' )

ax = plt.subplot(3, 4, 1)

data = ts[0, :]
plt.plot(time, data)
plt.title('Annual Mean Global Mean Temperature', fontsize=14)
plt.xlabel('year', fontsize=12)
plt.ylabel(modnames[0], fontsize=12)
plt.xlim(0, 50), plt.ylim(275, 310)
ax.set_xticks(time)
ax.set_xticklabels(time, fontsize = 8)

ax= plt.subplot(3, 4, 2)

data = ts[1, :]
plt.plot(time, data)
plt.title('Annual Mean Global Mean Temperature', fontsize=14)
plt.xlabel('year', fontsize=12)
plt.ylabel(modnames[1], fontsize=12)
plt.xlim(0, 50), plt.ylim(275, 310)
ax.set_xticks(time)


ax = plt.subplot(3, 4, 3)

data = ts[2, :]
plt.plot(time, data)
plt.title('Annual Mean Global Mean Temperature', fontsize=14)
plt.xlabel('year', fontsize=12)
plt.ylabel(modnames[2], fontsize=12)
plt.xlim(0, 50), plt.ylim(275, 310)
ax.set_xticks(time)


plt.tight_layout()
plt.show()
plt.close

目前有 9 个缺失的地块,我相信你可以猜到,

这里是三个问题,要明确: 1) 与图的大小相比,每个子图都很小(而且,你知道......什么很容易看到)。减小图的大小不会使子图更易于阅读。

2) 它们靠得太近了。我对如何解决这个问题有一些想法,但我觉得我需要先解决 1)。

3) 轴是如此之小,以至于 xticks 看起来都成束了

我已经搜索并发现没有关于如何执行此操作的解释,这是以我可以理解的水平编写的。 pyplot 文档对我来说基本上是胡言乱语。

提前感谢您提供的任何帮助(如果有人可以就我正在做的事情提供更一般的建议以及解决此问题的具体建议,我将不胜感激)。

【问题讨论】:

    标签: python matplotlib subplot


    【解决方案1】:

    好的,这里发生了几件事。让我们一次一个地浏览它们。实例化绘图后,调用ax = plt.subplot(3, 4, _) 3 次。但是,.subplot(3,4,_) 将绘图分成 3 行和 4 列,下划线选择从 1(而不是 0)开始选择该网格的哪一块。我们可以用下面的代码给它们编号:

    plt.figure( figsize=(12, 5), dpi=80, facecolor='w', edgecolor='k' )
    for N in range(1,13):
        ax = plt.subplot(3, 4, N)
        ax.annotate(s=str(N), xy=(.4,.4), fontsize=16)
    

    因此,但是使用 .subplot(3, 4, 1).subplot(3, 4, 2).subplot(3, 4, 3),您只能选择 12 个部分中的前 3 个。

    当您将数据添加到绘图时,ax.set_xticks(time) 在 x 轴上添加 45 个刻度(数量不少),ax.set_xticklabels(time, fontsize = 8) 在每个刻度处添加一个标签。这就是为什么它看起来如此拥挤。一种选择是减少刻度数,另一种是向外拉伸 x 轴。由于您有 3 个子图,我认为您想要垂直堆叠 3 行。

    您不需要plt.xlim(0, 50)plt.ylim(275, 310)。该轴将为您调整绘图限制的大小,除非您有特定原因需要覆盖它们。

    我的建议是使用plt.subplots(3, 1)(注意额外的“s”)而不是重复调用plt.subplot。有什么不同? plt.subplots(3,1) 返回 figure 对象和 axis 对象数组的元组。在这种情况下,它是一维数组,因为我们只调用 1 列。 (注意:我为说明目的创建了假数据。)

    fig, axes = plt.subplots(3,1, figsize=(12,5), dpi=80, facecolor='w',
                             edgecolor='k', sharex=True)  # sharex shares the x-axis
    
    for i, ax in enumerate(axes):  # need to enumerate to slice the data
        data = ts[i, :]
        ax.plot(time, data)
        ax.set_ylabel(modnames[i], fontsize=12)
        ax.set_xticks(time)
        ax.set_xticklabels(time, fontsize = 8)
    
    # set xlabel outside of for loop so only the last axis get an xlabel
    ax.set_xlabel('year', fontsize=12)
    fig.tight_layout()
    
    # set the title, adjust the spacing
    fig.suptitle('Annual Mean Global Mean Temperature', fontsize=14)
    fig.subplots_adjust(top=0.90)
    

    【讨论】: