使用matplotlib显示多个y轴棘时,减小一个子图的宽度

时间:2018-08-22 15:13:18

标签: python python-3.x matplotlib charts

我有一个图,该图包含三个子图,排列在同一列中。这些图之一在右侧使用了3个y轴刺。我跟随this tutorial在子图中插入了多个右轴棘。

我的问题是,通过添加额外的刺,图中的所有子图在x方向上变小了。这更改了所有三个子图的宽度,从而在其他子图的右侧保留了未使用的空间。

在y轴上添加额外的棘刺时,如何仅调整一个子图的宽度?

下面是一个简化的示例,它产生与this image

中所示的问题相同的问题
from matplotlib import pyplot as plt

# set up a set of three subplots
fig = plt.figure(figsize=(17, 11))

ax_1_l = fig.add_subplot(3,1,1)
ax_1_r = ax_1_l.twinx()

ax_2_l = fig.add_subplot(3,1,2)
ax_2_r = ax_2_l.twinx()

ax_3_l = fig.add_subplot(3,1,3)
ax_3_r = ax_3_l.twinx()


# add additional axes to the middle subplot as per tutorial
def make_patch_and_spines_invisible(ax):
  ax.set_frame_on(True)
  ax.patch.set_visible(False)
  for sp in ax.spines.values():
    sp.set_visible(False)

ax_2_r_2 = ax_2_l.twinx()
make_patch_and_spines_invisible(ax_2_r_2)
ax_2_r_2.spines['right'].set_position(('axes', 1.05))
ax_2_r_2.spines['right'].set_visible(True)

ax_2_r_3 = ax_2_l.twinx()
make_patch_and_spines_invisible(ax_2_r_3)
ax_2_r_3.spines['right'].set_position(('axes', 1.1))
ax_2_r_3.spines['right'].set_visible(True)

# display the plots
plt.tight_layout()
plt.show()

Sample Output Image from my code

matplotlib版本2.1.2

3 个答案:

答案 0 :(得分:0)

可能的答案是使用matplotlibs subplot2grid功能。缺点是它不会自动调整大小,您将不得不手动进行调整。

将子图的创建替换为:

ax_1_l = plt.subplot2grid((3, 11), (0, 0), colspan=11)
ax_2_l = plt.subplot2grid((3, 11), (1, 0), colspan=10)
ax_3_l = plt.subplot2grid((3, 11), (2, 0), colspan=11)

ax_1_r = ax_1_l.twinx()
ax_2_r = ax_2_l.twinx()
ax_3_r = ax_3_l.twinx()

我制作了一个3行11列的网格,然后设置colspan,以使子图2略小于其他2,以留出空间给棘刺。 (还是反复试验的方法,所以不是完美的解决方案)

enter image description here

答案 1 :(得分:0)

使用gridspec解决问题的另一种方法,您还必须手动设置中间曲线的右手极限。但是您像这里的原始代码一样,坚持使用3行1列的格式。只需用以下几行替换函数定义之前的代码:

import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(3, 1)

ax_1_l = plt.subplot(gs[0])
ax_3_l = plt.subplot(gs[2])
ax_1_r = ax_1_l.twinx()
ax_3_r = ax_3_l.twinx()

gs = gridspec.GridSpec(3, 1)
gs.update(right=0.85)  # This is the part where you specify the bound
ax_2_l = plt.subplot(gs[1])
ax_2_r = ax_2_l.twinx()

输出

enter image description here

答案 2 :(得分:0)

您可以使用Axes.set_position()来调整各个子图的位置/大小。由于您只想更改x的上限,因此可以执行以下操作:

bb = ax_1_l.get_position()
bb.x1 = 0.97
ax_1_l.set_position(bb)
bb = ax_3_l.get_position()
bb.x1 = 0.97
ax_3_l.set_position(bb)

更改第一和第三子图的右边缘。