使用pyplot创建绘图网格

8
我是新手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)

给予

enter image description here

现在我认为我需要使用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()

enter image description here

然而,如果我继续这样做,那么图形会变得越来越小,并开始在x和y标签上重叠。这里是一个3×3图形的图片。

enter image description here

有没有一种方法可以均匀地分配图形的空间,以便它们不重叠,并更好地利用Jupyter Notebook中的水平和垂直内联空间?为了说明这一点,在这里是来自jupyter的屏幕截图:

enter image description here

最终说明:我仍需要添加一个标题或注释,以显示在plot_CV中使用的当前lambda级别。

编辑:使用建议的紧凑布局,得到:

enter image description here


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

enter image description here


1
你在 plt.show() 之前尝试过 plt.tight_layout() 吗?否则你需要减少刻度标签的频率和轴标签的大小。 - sascha
@sascha 谢谢,看到更新了 - tomka
1个回答

11

针对您的问题,第一条建议是查看 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)

这样,您就可以防止子图之间进一步挤在一起。

祝您好运!


你实现了自己期望的绘图设计吗?它们看起来更好了 :) 我很好奇,因为我自己很快也会制作许多类似的图形,想要知道。 - Kyle Swanson
到目前为止还不行。在编辑下方的结果仍然让我感到不满意。它没有对图形大小控制命令做出反应;没有错误,但大小也没有改变。 - tomka
你想单独控制所有子图的大小还是整个图一起控制? - Kyle Swanson
谢谢,fig.set_figheight 已经在很大程度上解决了问题。我会贴出最终结果的更新。也许你可以进一步改进它。 - tomka
1
看起来不错!我不确定你的下一个目标是什么? - Kyle Swanson
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接