Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用matplotlib显示多个y轴脊椎时,减少一个子批次的宽度_Python_Python 3.x_Matplotlib_Charts - Fatal编程技术网

Python 使用matplotlib显示多个y轴脊椎时,减少一个子批次的宽度

Python 使用matplotlib显示多个y轴脊椎时,减少一个子批次的宽度,python,python-3.x,matplotlib,charts,Python,Python 3.x,Matplotlib,Charts,我有一个包含三个子地块的图形,排列在一列中。其中一个图在右侧使用3个y轴脊椎。我随后在子地块上插入了多个右轴脊椎 我的问题是,通过添加额外的脊椎,图中的所有子地块在x方向上都变小了。这改变了所有三个子地块的宽度,在其他子地块的右侧留下了未使用的空间 在y轴上添加附加脊椎时,如何仅调整一个子批次的宽度 下面是一个简化的示例,它产生了与中所示相同的问题 matplotlib版本2.1.2一个可能的答案是使用matplotlibssubplot2grid功能。缺点是它不会自动调整尺寸,您必须手动调整

我有一个包含三个子地块的图形,排列在一列中。其中一个图在右侧使用3个y轴脊椎。我随后在子地块上插入了多个右轴脊椎

我的问题是,通过添加额外的脊椎,图中的所有子地块在x方向上都变小了。这改变了所有三个子地块的宽度,在其他子地块的右侧留下了未使用的空间

在y轴上添加附加脊椎时,如何仅调整一个子批次的宽度

下面是一个简化的示例,它产生了与中所示相同的问题


matplotlib版本2.1.2

一个可能的答案是使用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比其他两个稍微小,以便为脊椎留出空间。(同样是一种反复试验的方法,因此不是完美的解决方案)


使用
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()
输出


您可以使用
轴。设置_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)

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

Hi Evan,请您共享工作代码,以便我们可以复制图形并尝试提供帮助解决方案?具体来说,我将尝试将大型程序缩减为显示相同问题的较短脚本。我将不得不用一些示例替换真实数据。示例数据很好(尽管我认为这与数据无关,所以可能仅仅创建空的子地块就足够了。)正如DavidG建议的那样,我添加了一个没有任何数据的简单代码示例。我接受这个解决方案是因为它非常适合我的代码结构。David和John还提供了他们看到的有限示例代码的工作解决方案。很高兴它帮助了您!
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)