首页 > 解决方案 > 调整 gridspec 以使绘制的数据对齐

问题描述

我有几个要绘制的图表,它们的宽度都是某个单位的倍数,如下图所示。 在此处输入图像描述

所以底轴是整个宽度的 1/4,倒数第二个是宽度的 2/4,依此类推。

我正在使用的代码:

import matplotlib.pyplot as plt
divs = 4
fig = plt.figure()
gs = fig.add_gridspec(ncols = divs, nrows = divs)
axes = [fig.add_subplot(gs[div, div:]) for div in range(divs)]
for row in range(divs):
    axes[row].plot([1]*10*(divs - row), c = 'r')
    axes[row].set_xlabel('', fontsize = 6)
fig.set_figheight(10)
fig.set_figwidth(10)
plt.show()

我的问题是这些图并没有按照我想要的那样完全对齐:第 2 行的图从第 1 行图的“10”刻度线的右侧开始,这同样适用于第 1 行的图3 与第 2 行的情节等。我希望第 2 行的情节的开头与第 1 行的“10”精确同步,其他情节也是如此。这是如何实现的(不一定,但最好使用 gridspec)?

我尝试添加axes[row].tick_params(axis="y",direction="in", pad=-22)以将 y 轴推入图中,但这并没有改变对齐方式。我也尝试使用fig.tight_layout(pad = 0.3): 这也没有改变对齐方式。

标签: pythonmatplotlibsubplotfigure

解决方案


如果将图形 X 轴的边距的默认值设置为 0,则刻度将匹配。

import matplotlib.pyplot as plt
divs = 4
fig = plt.figure()
gs = fig.add_gridspec(ncols = divs, nrows = divs)
plt.rcParams['axes.xmargin'] = 0.0 #updated

axes = [fig.add_subplot(gs[div, div:]) for div in range(divs)]
for row in range(divs):
    axes[row].plot([1]*10*(divs - row), c = 'r')
    axes[row].set_xlabel('', fontsize = 6)

fig.set_figheight(10)
fig.set_figwidth(10)
plt.show()

在此处输入图像描述

子图(gridspec_kw=()...)

import matplotlib.pyplot as plt
divs = 4

fig, axes = plt.subplots(4,1, gridspec_kw=dict(height_ratios=[1,1,1,1]), sharex='col', figsize=(10,10))
for row in range(divs):
    axes[row].plot([1]*10*(divs - row), c = 'r')
    axes[row].set_xlabel('', fontsize = 6)

plt.show()

在此处输入图像描述


推荐阅读