【问题标题】:Using pyplot to create grids of plots使用 pyplot 创建绘图网格
【发布时间】:2016-09-23 11:46:26
【问题描述】:

我是 python 新手,在使用 pyplot 绘图时遇到一些困难。我的目标是在 Juypter Notebook 中在线绘制一个网格 (%pylab inline)。

我编写了一个函数plot_CV,它在某个 x 的多项式次数上绘制了交叉验证错误,其中惩罚程度 (lambda) 应该是不同的。最终,lambda 中有 10 个元素,它们由plot_CV 中的第一个参数控制。所以

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1) 
ax1 = plot_CV(1,CV_ve=CV_ve)

给予

现在我想我必须使用add_subplot 来创建一个图网格,如下所示

fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax1 = plot_CV(1,CV_ve=CV_ve)
ax2 = fig.add_subplot(2,2,2)
ax2 = plot_CV(2,CV_ve=CV_ve)
ax3 = fig.add_subplot(2,2,3)
ax3 = plot_CV(3,CV_ve=CV_ve)
ax4 = fig.add_subplot(2,2,4)
ax4 = plot_CV(4,CV_ve=CV_ve)
plt.show()

但是,如果我继续这样做,那么图会变得越来越小,并开始在 x 和 y 标签上重叠。这是一张带有 3 x 3 情节的图片。

有没有办法让绘图均匀分布,使它们不重叠并更好地利用 Jupyter Notebook 中的水平和垂直内联空间?为了说明这一点,这里有一个来自 jupyter 的截图:

最后说明:我仍然需要使用plot_CV 中使用的当前 lambda 级别添加标题或注释。


编辑:使用建议的紧凑布局,给出:


编辑 2:使用 fig.set_figheightfig.set_figwidth 我终于可以使用可用的完整长度和高度。

【问题讨论】:

  • 您在plt.show() 之前尝试过plt.tight_layout()。否则,您将不得不减少刻度标签频率和轴标签大小。
  • @sascha 谢谢,查看更新

标签: python matplotlib plot


【解决方案1】:

对您的问题的第一个建议是查看matplotlib 的“Tight Layout guide”。

他们有一个看起来与您的情况非常相似的示例。他们还提供了考虑轴标签和情节标题的示例和建议。

此外,您可以使用 matplotlib.figure 类中的 Figure 来控制整体图形大小。

Figure(figsize = (x,y))

figsize: x,y (inches)

编辑:

这是我从matplotlib 网站提取并添加到的示例:

fig.set_figheight(15)
fig.set_figwidth(15)

示例:

import matplotlib.pyplot as plt

plt.rcParams['savefig.facecolor'] = "0.8"

def example_plot(ax, fontsize=12):
     ax.plot([1, 2])
     ax.locator_params(nbins=3)
     ax.set_xlabel('x-label', fontsize=fontsize)
     ax.set_ylabel('y-label', fontsize=fontsize)
     ax.set_title('Title', fontsize=fontsize)

plt.close('all')
fig = plt.figure()

fig.set_figheight(15)
fig.set_figwidth(15)


ax1 = plt.subplot2grid((3, 3), (0, 0))
ax2 = plt.subplot2grid((3, 3), (0, 1), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=2)
ax4 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)

example_plot(ax1)
example_plot(ax2)
example_plot(ax3)
example_plot(ax4)

plt.tight_layout()

您可以通过这种方式使用tight_layout 来实现子图的填充:

plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)

这样你就可以防止你的子图进一步拥挤。

祝你好运!

【讨论】:

  • 你实现了你想要的情节制作设计吗?它们看起来更好:) 我很好奇,因为我自己很快就会制作很多这样的情节并且想知道。
  • 没有到目前为止没有工作。编辑下的结果对我来说仍然不令人满意。它不响应图形大小控制命令;没有错误,但大小也没有变化。
  • 你想单独控制所有子图的大小还是一起控制整个图?
  • 完全控制整个情节的大小就足够了,这样它就变得更清晰了。此外,当我制作 3x4 绘图而不是 4x3 时,这些绘图会紧紧相连,并且不会使用绘图右侧的全部空间
  • 看起来更好!我不确定你的下一个目标是什么?
猜你喜欢
  • 2020-12-08
  • 2017-10-22
  • 2015-08-09
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多