【问题标题】:Difference between sharey='row' and sharey='True'sharey='row' 和 sharey='True' 的区别
【发布时间】:2018-10-30 13:18:26
【问题描述】:

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

要绘制 3 个因变量:Y1Y2Y3,与常见的 X 自变量相比,用于 4 个研究案例:

在这种情况下有:

1) 从case icase i+1 时共享y

2) 在case i 内共享x

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

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

adjustable='box-forced' 只是为了确保子图是平方的,正如 here 解释的那样。

当我尝试为案例 1 绘制 Y1X 时:

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()

一切似乎都很好:

我已经强制剧情到axes[0][0].set_ylim(bottom=-941.238, top=-941.229)

当我尝试为Case 1 绘制Y2X 时,以下代码应该可以工作:我基本上和以前一样,但添加了axes[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()

结果是axes[0][0] 图的比例发生了变化,因此没有显示数据:

我已经强制axes[0][0]axes[0][1] 显示确实有数据的区域:

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

但是,axes[0][0] 图上没有显示任何数据。为什么会这样?

更新:sharey='row'sharey=True 之间的区别已在 @DavidG 的出色回答中得到澄清。但是,我测试了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' 声明以使子图平方:

我想知道为什么会这样?

【问题讨论】:

    标签: matplotlib subplot


    【解决方案1】:

    您已使用参数 sharey=True 将共享 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=Truesharex='col' 之间的差异会产生不同的结果(请参阅更新后的帖子)。
    • 我已更改帖子的标题,以便将其呈现为更一般的案例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2015-06-11
    • 2023-04-07
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多