Python 使用matplotlib中的多个子地块改进子地块大小/间距

Python 使用matplotlib中的多个子地块改进子地块大小/间距,python,matplotlib,Python,Matplotlib,非常类似,但不同的是,我的数字可以大到它需要的程度 我需要在matplotlib中生成一大堆垂直堆叠的绘图。结果将使用figsave保存并在网页上查看,因此我不在乎最终图像有多高,只要子图片间隔开,这样它们就不会重叠 无论我允许这个数字有多大,子地块似乎总是重叠 我的代码目前看起来像 import matplotlib.pyplot as plt import my_other_module titles, x_lists, y_lists = my_other_module.get_data

非常类似,但不同的是,我的数字可以大到它需要的程度

我需要在matplotlib中生成一大堆垂直堆叠的绘图。结果将使用figsave保存并在网页上查看,因此我不在乎最终图像有多高,只要子图片间隔开,这样它们就不会重叠

无论我允许这个数字有多大,子地块似乎总是重叠

我的代码目前看起来像

import matplotlib.pyplot as plt
import my_other_module

titles, x_lists, y_lists = my_other_module.get_data()

fig = plt.figure(figsize=(10,60))
for i, y_list in enumerate(y_lists):
    plt.subplot(len(titles), 1, i)
    plt.xlabel("Some X label")
    plt.ylabel("Some Y label")
    plt.title(titles[i])
    plt.plot(x_lists[i],y_list)
fig.savefig('out.png', dpi=100)

您可以使用
plt.subplot\u adjust
更改子地块之间的间距

电话签名:

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
参数含义(和建议的默认值)为:


实际默认值由rc文件控制

我发现子批次调整(hspace=0.001)最终对我有效。当我使用space=None时,每个绘图之间仍有空白。然而,将其设置为非常接近于零的值似乎会迫使他们排队。我在这里上传的不是最优雅的代码,但是你可以看到hspace是如何工作的

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

fig = plt.figure()

x = np.arange(100)
y = 3.*np.sin(x*2.*np.pi/100.)

for i in range(5):
    temp = 510 + i
    ax = plt.subplot(temp)
    plt.plot(x,y)
    plt.subplots_adjust(hspace = .001)
    temp = tic.MaxNLocator(3)
    ax.yaxis.set_major_locator(temp)
    ax.set_xticklabels(())
    ax.title.set_visible(False)

plt.show()
尝试使用

举个简单的例子:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4)
fig.tight_layout() # Or equivalently,  "plt.tight_layout()"

plt.show()

没有严密的布局


布局紧凑

plt.子批次调整方法:

def subplots_adjust(*args, **kwargs):
    """
    call signature::

      subplots_adjust(left=None, bottom=None, right=None, top=None,
                      wspace=None, hspace=None)

    Tune the subplot layout via the
    :class:`matplotlib.figure.SubplotParams` mechanism.  The parameter
    meanings (and suggested defaults) are::

      left  = 0.125  # the left side of the subplots of the figure
      right = 0.9    # the right side of the subplots of the figure
      bottom = 0.1   # the bottom of the subplots of the figure
      top = 0.9      # the top of the subplots of the figure
      wspace = 0.2   # the amount of width reserved for blank space between subplots
      hspace = 0.2   # the amount of height reserved for white space between subplots

    The actual defaults are controlled by the rc file
    """
    fig = gcf()
    fig.subplots_adjust(*args, **kwargs)
    draw_if_interactive()

fig = plt.figure(figsize=(10,60))
fig.subplots_adjust( ... )

图片的大小很重要


“我尝试过使用hspace,但增加它似乎只会使所有图形变小,而不会解决重叠问题。”


因此,为了产生更多的空白并保持子图大小,总图像需要更大。

您可以尝试使用子图工具()


类似于现在(从2.2版开始)的matplotlib提供的紧密布局。与单个优化布局在代码中随时调用的
紧密布局
不同,
约束布局
是一个属性,它可能处于活动状态,并将在每个绘图步骤之前优化布局

因此,需要在创建子地块之前或期间激活它,例如
图(受约束的\u布局=真)
子地块(受约束的\u布局=真)

例如:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()

也可以通过
rcParams

plt.rcParams['figure.constrained_layout.use'] = True


请参阅和

我尝试过使用hspace,但增加它似乎只会使所有图形变小,而不会解决重叠问题。我也尝试过使用其他参数,但我不知道左、右、下和上在那里实际指定了什么。@mcstrother如果在显示绘图后单击“调整”按钮,您可以以交互方式更改所有6个参数,一旦你找到有效的方法,就把它们复制到代码中。我没有看到调整按钮。虽然我在一个笔记本里。我尝试了%matplotlib inline和%matplotlib notebook。@MattKleinsmith:调整按钮的悬停文本为“配置子批次”,并在matplotlib的常规非笔记本使用中显示。这是“软盘”保存按钮左侧的按钮:-注意,根据您使用的窗口系统,按钮看起来不同,但它总是在保存按钮的左侧。@JohnZwinck,您的注释中的链接现在已失效。如果显示您应该在打印代码后执行此操作,则会更清晰一些,但是就在show()之前,紧密的布局()被击中了。我一直在试图理解当它没有影响时(仍然存在较大的图间边距)会有什么不同——这对我来说通常非常有效,只是它将我的图形标题(
suptitle
)与我的子地块标题重叠。如果有人遇到类似的问题,以下是对我的帮助。也就是说,
tight_layout()
rect
参数有助于了解,如果添加轴标题,可以使用plt.tight_layout(pad=0.4,w_pad=0.5,h_pad=1.0)。
plt.tight_layout()
解决了我的一天。漂亮的作品!看图片的大小问题,图片的大小越大就可以解决这个问题!设置
plt.figure(figsize=(10,7))
,图片的大小将是
2000x1400
pix要尝试一下:没有看到这个选项-而且
tight\u布局不可靠这听起来很有希望,但没有给我足够的间距(轴标签和标题仍然重叠),渲染时间更长<代码>紧密布局()better@craq正确,一般来说,
contained_layout
比较慢,因为从这个答案中可以看出,它在每个绘图步骤之前都会优化布局。对我来说,这是最有用的答案-紧凑的_layout对我来说总是会改善垂直间距,为面板标题留出空间,但每次都要以切断y轴标签为代价。相反,这非常有效,谢谢。@craq,如果您有一个无法正确间隔轴的可复制示例,如果您在最新的Matplotlib(3.4.x)上打开一个问题,它将非常有用,因为它使用受约束的_布局快得多。此代码生成一个错误:ValueError Traceback(最近一次调用last)对于范围(5)中的i,在10中:11温度=510+i--->12 ax=plt。子批次(温度)值错误:num必须为1
plt.subplot_tool()
import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()
plt.rcParams['figure.constrained_layout.use'] = True