如何在Matplotlib中用非GridSpec方式实现2×2网格下轴占满整行
解决Matplotlib子图跨行占位问题(无需GridSpec)
问题核心
你需要在2行2列的绘图网格中,让第二行的单个坐标轴占据整行,且不想使用GridSpec,同时疑惑plt.subplot(212)为何能在这种场景下生效。
原理拆解
plt.subplot()的参数遵循nrows ncols index的规则,三个数字可连写:
223:对应2行2列的网格,选取第3个位置(按行从左到右计数:第一行左为1、右为2;第二行左为3、右为4)212:对应2行1列的网格,选取第2个位置
Matplotlib允许在同一张画布上混合不同的网格划分:你先创建了2行2列网格的前两个子图,再用212创建子图时,这个子图会占据2行1列网格的第二行区域——刚好覆盖原2行2列网格的整个第二行,和前两个子图没有位置冲突,因此能实现你要的跨行占位效果。
修改后的完整代码
import matplotlib.pyplot as plt fig = plt.figure(figsize=[10,10]) # 2行2列网格的前两个子图 ax0 = fig.add_subplot(221) ax0.scatter(xlist[:10], ylist[:10], color='red') ax1 = fig.add_subplot(222) ax1.scatter(xlist[10:], ylist[10:], color='green') # 2行1列网格的第二个子图,占据整行 ax3 = fig.add_subplot(212) ax3.scatter(xlist, ylist) plt.show()
额外说明
这种混合子图参数的方式是利用Matplotlib布局系统的灵活性,在简单跨行场景下比GridSpec更简洁。如果是更复杂的多跨行跨列布局,GridSpec会是更可控的选择。
内容的提问来源于stack exchange,提问作者Pixel_Bear
相关产品推荐
相关产品推荐

