Matplotlib sharey='之间的差异;第'行;和sharey=';正确';

Matplotlib sharey='之间的差异;第'行;和sharey=';正确';,matplotlib,subplot,Matplotlib,Subplot,我正在考虑一个包含3行4列的绘图,其中: 有3个因变量需要绘制:Y1、Y2和Y3,与常见的X自变量相比,4个研究案例: 在这种情况下,有: 1) 当从案例i到案例i+1 2) 在案例i中共享x轴 因此,原则上,人们会认为以下代码将生成所需的绘图(结果如上图所示): 如前所述,adjustable='box-forced'只是为了确保子批次是平方的 当我尝试为案例1绘制Y1与X的对比图时: import numpy as np import matplotlib.pyplot as plt im

我正在考虑一个包含3行4列的绘图,其中:

有3个因变量需要绘制:
Y1
Y2
Y3
,与常见的
X
自变量相比,4个研究案例:

在这种情况下,有:

1) 当从
案例i
案例i+1

2) 在
案例i中共享
x

因此,原则上,人们会认为以下代码将生成所需的绘图(结果如上图所示):

如前所述,
adjustable='box-forced'
只是为了确保子批次是平方的

当我尝试为案例1绘制
Y1
X
的对比图时:

import numpy as np
import matplotlib.pyplot as plt
import sys

fig, axes = plt.subplots(ncols=4, nrows=3,\
                         sharex=True, sharey=True,\
                         subplot_kw=dict(adjustable='box-forced'))

pad = 5
axes[0][0].annotate('Case 1', xy=(0.5, 1), xytext=(0, pad),
                xycoords='axes fraction', textcoords='offset points',
                 size='large', ha='center', va='baseline')

axes[0][1].annotate('Case 2', xy=(0.5, 1), xytext=(0, pad),
                xycoords='axes fraction', textcoords='offset points',
                 size='large', ha='center', va='baseline')

axes[0][2].annotate('Case 3', xy=(0.5, 1), xytext=(0, pad),
               xycoords='axes fraction', textcoords='offset points',
                size='large', ha='center', va='baseline')

axes[0][3].annotate('Case 4', xy=(0.5, 1), xytext=(0, pad),
                xycoords='axes fraction', textcoords='offset points',
                 size='large', ha='center', va='baseline')

#
axes[0][0].set_ylabel('Y1', fontsize=10)
axes[1][0].set_ylabel('Y2', fontsize=10)
axes[2][0].set_ylabel('Y3', fontsize=10)

E_C_I =  np.array([-941.23658347, -941.23685494, -941.23467666])
V_C_I =  np.array([ 61.66341, 62.342903,  67.9311515])
E_14 =  np.array([-941.22938469, -941.23583586, -941.23605613])
V_14 =  np.array([ 54.65693125,  58.47115725, 60.8626545 ])
P_C_I =  np.array([ 2.20068119,  1.33328211,  -4.28370285])
P_14 =  np.array([ 8.16605135,  7.54737315, 0.3909309 ])


axes[0][0].scatter(V_C_I, E_C_I, marker='^', color='red', label='Calcite I')#, s=100)
axes[0][0].scatter(V_14, E_14, marker='o', color='green', label='Calcite I')#, s=100)

axes[0][0].set_ylim(bottom=-941.238, top=-941.229)

plt.tight_layout()
axes[0][0].ticklabel_format(useOffset=False)
plt.show()
sys.exit()
一切似乎都很好:

我已强制绘图到轴[0][0]
set_ylim(底部=-941.238,顶部=-941.229)

当我尝试为
案例1
绘制
Y2
X
时,以下代码应该可以工作:我基本上与以前一样,但添加了
轴[1][0]
绘图指令:

import numpy as np
import matplotlib.pyplot as plt
import sys

fig, axes = plt.subplots(ncols=4, nrows=3,\
                         sharex=True, sharey=True,\
                         subplot_kw=dict(adjustable='box-forced'))

pad = 5
axes[0][0].annotate('Case 1', xy=(0.5, 1), xytext=(0, pad),
                xycoords='axes fraction', textcoords='offset points',
                 size='large', ha='center', va='baseline')

axes[0][1].annotate('Case 2', xy=(0.5, 1), xytext=(0, pad),
                xycoords='axes fraction', textcoords='offset points',
                 size='large', ha='center', va='baseline')

axes[0][2].annotate('Case 3', xy=(0.5, 1), xytext=(0, pad),
               xycoords='axes fraction', textcoords='offset points',
                size='large', ha='center', va='baseline')

axes[0][3].annotate('Case 4', xy=(0.5, 1), xytext=(0, pad),
                xycoords='axes fraction', textcoords='offset points',
                 size='large', ha='center', va='baseline')

#
axes[0][0].set_ylabel('Y1', fontsize=10)
axes[1][0].set_ylabel('Y2', fontsize=10)
axes[2][0].set_ylabel('Y3', fontsize=10)

E_C_I =  np.array([-941.23658347, -941.23685494, -941.23467666])
V_C_I =  np.array([ 61.66341, 62.342903,  67.9311515])
E_14 =  np.array([-941.22938469, -941.23583586, -941.23605613])
V_14 =  np.array([ 54.65693125,  58.47115725, 60.8626545 ])
P_C_I =  np.array([ 2.20068119,  1.33328211,  -4.28370285])
P_14 =  np.array([ 8.16605135,  7.54737315, 0.3909309 ])


axes[0][0].scatter(V_C_I, E_C_I, marker='^', color='red', label='Calcite I')#, s=100)
axes[0][0].scatter(V_14, E_14, marker='o', color='green', label='Calcite I')#, s=100)

axes[0][0].set_ylim(bottom=-941.238, top=-941.229)

axes[1][0].scatter(V_C_I, P_C_I, marker='^', color='red', label='Calcite I')#, s=100)
axes[1][0].scatter(V_14, P_14, marker='o', color='green', label='Calcite I')#, s=100)

axes[1][0].set_ylim(bottom=-4.4, top=8.4)

plt.tight_layout()
axes[0][0].ticklabel_format(useOffset=False)
plt.show()
sys.exit()
结果是
轴[0][0]
绘图已改变其比例,因此未显示任何数据:

我已强制
轴[0][0]
轴[0][1]
显示确实存在数据的区域:

axes[0][0].set_ylim(bottom=-941.238, top=-941.229)
axes[1][0].set_ylim(bottom=-4.4, top=8.4)
但是,
轴[0][0]
图上未显示任何数据。为什么会这样

更新:优秀的@DavidG回答中澄清了
sharey='row'
sharey=True
之间的区别。然而,我已经测试了
sharex='col'
sharex=True
之间的差异,我注意到:

fig, axes = plt.subplots(ncols=4, nrows=3,\
                         sharex=True, sharey='row',\
                         subplot_kw=dict(adjustable='box-forced'))
产生以下结果:

但是,

fig, axes = plt.subplots(ncols=4, nrows=3,\
                         sharex='col', sharey='row',\
                         subplot_kw=dict(adjustable='box-forced'))
在列之间留有一些空间,并打破了要平方的子批次的
adjustable='box-forced'
声明:


我想知道为什么会发生这种情况?

您已经使用参数
sharey=True
将share y轴应用于所有子地块

有一个方便的参数
sharey='row'
,它将使子地块的每一行共享相同的y轴。因此,将图形的创建更改为:

fig, axes = plt.subplots(ncols=4, nrows=3,\
                         sharex=True, sharey='row',\
                         subplot_kw=dict(adjustable='box-forced'))
这将给出下图:


非常感谢您的回答。您已经很好地指出了
sharey='row'
sharey=True
之间的区别。然而,我注意到
sharex=True
sharex='col'
之间的差异产生了一种不同的结果(请参阅更新的帖子)。我已经更改了帖子的标题,以便将其作为更一般的情况呈现
fig, axes = plt.subplots(ncols=4, nrows=3,\
                         sharex=True, sharey='row',\
                         subplot_kw=dict(adjustable='box-forced'))