Skip to main content
 首页 » 编程设计

python之使用 pyplot 创建绘图网格

2025年05月04日28jpfss

我是 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_figheight 和 fig.set_figwidth 我终于可以使用可用的完整长度和高度。

请您参考如下方法:

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

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

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

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)

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

祝你好运!