【问题标题】:Matplotlib Subplots Are Too Narrow With Tight LayoutMatplotlib 子图太窄,布局紧凑
【发布时间】:2018-12-14 12:55:29
【问题描述】:

我目前正在尝试使用 GridSpec 在 Matplotlib(Python 3.6、Matplotlib 2.0.0)中绘制许多子图。这是最小的工作示例:

import matplotlib.pyplot as plt
from matplotlib.gridspec import *

# Color vector for scatter plot points
preds = np.random.randint(2, size=100000)

# Setup the scatter plots
fig = plt.figure(figsize=(8,8))
grid = GridSpec(9, 9)

# Create the scatter plots
for ii in np.arange(0, 9):
    for jj in np.arange(0, 9):
        if (ii > jj):
            ax = fig.add_subplot(grid[ii, jj])
            x = np.random.rand(100000)*2000
            y = np.random.rand(100000)*2000
            ax.scatter(x, y, c=preds)

这是未经任何修改的结果:

当然,子图之间的间距不能令人满意,所以我做了我通常做的事情并使用了tight_layout()。但是从下图中可以看出,tight_layout() 压缩了地块的宽度让人无法接受:

我认为我应该使用 subplots_adjust() 手动调整子图,而不是使用 tight_layout()。下图为subplots_adjust(hspace=1.0, wspace=1.0)

结果几乎是正确的,再稍微调整一下子图之间的空间就会很完美。然而,子图似乎太小而无法充分传达信息。

有没有更好的方法来获得子图之间的适当间距,同时仍保持纵横比和足够大的子图大小?我能想到的唯一可能的解决方案是使用subplots_adjust() 和更大的figsize,但这会导致图形边缘和子图之间的空间非常大。

感谢任何解决方案。

【问题讨论】:

  • 如果您可以使用 matplotlib 的替代品,您可能想看看Plotly subplots

标签: python matplotlib subplot


【解决方案1】:

由于所有坐标轴都具有相同的xy 范围,我会选择仅在外部Axes 上显示刻度标签。对于大小相等的子图网格,可以使用 plt.subplots()sharexsharey 关键字轻松实现自动化。当然,如果您设置了一个 9x9 子图的网格,这会给您提供比您想要的更多的图,但是您可以使冗余图不可见(例如使用 Axes.set_visible 或完全删除它们。在下面的示例中,我使用后者。

from matplotlib import pyplot as plt
import numpy as np

fig, axes = plt.subplots(
    nrows=9, ncols=9, sharex=True, sharey=True, figsize = (8,8)
)

# Color vector for scatter plot points
preds = np.random.randint(2, size=1000)

# Create the scatter plots
for ii in np.arange(0, 9):
    for jj in np.arange(0, 9):
        if (ii > jj):
            ax = axes[ii,jj]
            x = np.random.rand(1000)*100
            y = np.random.rand(1000)*2000
            ax.scatter(x, y, c=preds)
        else:
            axes[ii,jj].remove() ##remove Axes from fig
            axes[ii,jj] = None   ##make sure that there are no 'dangling' references.    

plt.show()

生成的图形如下所示:

这当然可以用subplots_adjust() 之类的东西进一步调整。希望这会有所帮助。

【讨论】:

  • “因为你所有的轴都有相同的 x 和 y 范围” - 这似乎正是 不是 这里从图像判断这个问题。 @nguzman,如果你能将图像和工作示例代码同步,这样人们就知道你在追求什么了。
  • @ImportanceOfBeingErnest 哎呀,你是对的。我只是在运行示例代码。好吧,我想这个答案不是很有用......
  • @ImportanceOfBeingErnest 实际上,查看 OP 提供的第三张图片,如果您在每个子图中切换 xy 坐标,您实际上会得到一个配置,我的回答会有所帮助。因此,也许对情节进行一点重新安排会使这变得可行,但是,当然,在 OP 提供一些更好的代码之前,这都是非常推测的。
  • @ThomasKühn 一个可以理解的错误。似乎有问题的是,同一变量的缩放应该在行/列之间发生显着变化,并且代码不会生成示例图片。为什么人们投票支持这些模棱两可的问题,我无法理解。
  • 这就是为什么 Importance 要求提供Minimal, Complete, and Verifiable example 以便您和解决您的问题的人在同一页面上。您的示例图片显然不是由您的代码生成的。
猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多