Python 使用pyplot创建绘图网格

Python 使用pyplot创建绘图网格,python,matplotlib,plot,Python,Matplotlib,Plot,我是python新手,在使用pyplot绘图时遇到一些困难。我的目标是在Juypter笔记本中绘制一个网格状的内联绘图(%pylab inline) 我编写了一个函数plot_CV,该函数在某个x的多项式次数上绘制交叉验证erorr,其中在各图上,惩罚程度(lambda)应该是不同的。lambda中最终有10个元素,它们由plot\u CV中的第一个参数控制。所以 fig = plt.figure() ax1 = fig.add_subplot(1,1,1) ax1 = plot_CV(1,C

我是python新手,在使用
pyplot
绘图时遇到一些困难。我的目标是在Juypter笔记本中绘制一个网格状的内联绘图(
%pylab inline

我编写了一个函数
plot_CV
,该函数在某个x的多项式次数上绘制交叉验证erorr,其中在各图上,惩罚程度(lambda)应该是不同的。lambda中最终有10个元素,它们由
plot\u 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乘3的图

有没有一种方法可以将绘图均匀地隔开,这样它们就不会重叠,从而更好地利用Jupyter笔记本中的水平和垂直直线空间?为了说明这一点,这里提供了jupyter的屏幕截图:

最后一点注意:我仍然需要添加一个标题或注释,其中包含
plot\u CV
中使用的当前lambda级别


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


编辑2:使用
fig.set\u fighight
fig.set\u figwidth
我最终可以使用可用的全长和高度


解决您问题的第一个建议是查看
matplotlib
的“”

他们有一个在视觉上与您的情况非常相似的示例。此外,他们还提供了考虑轴标签和绘图标题的示例和建议

此外,您还可以使用类中的figure来控制总体体形大小

编辑:

以下是我从
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()
您可以通过以下方式使用紧密布局来实现子批次的填充:

plt.紧密布局(pad=0.4,w\u pad=0.5,h\u pad=1.0)

这样,您就可以避免子地块之间进一步拥挤


祝你过得愉快

您在
plt.show()
之前是否尝试过
plt.tight\u layout()
。否则,您将不得不减少刻度标签频率和轴标签大小。@谢谢,请参阅更新您是否实现了所需的绘图设计?它们看起来更好:)我很好奇,因为我自己很快就会做出很多这样的情节,我想知道。不,到目前为止还没有成功。编辑的结果对我来说仍然不令人满意。它不响应图形大小控制命令;没有错误,但大小也没有变化。是要单独控制所有子图的大小,还是要一起控制整个绘图?完全控制整个绘图的大小就足够了,这样它会变得更清晰。另外,当我制作一个3x4的绘图,而不是4x3时,绘图会紧密结合在一起,并且不会使用绘图右侧的全部空间,看起来更好!我不确定你的下一个目标是什么?
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()