我正在考虑一个包含3行和4列的图,其中:
有4个因变量可以绘制:Y1
,Y2
和Y3
,而不是常见的X
自变量,用于4个案例研究:
在这种情况下有:
1)从y
到case i
时共享case i+1
轴
2)在x
case i
轴
因此,原则上,人们会认为以下代码将产生所需的图(结果显示在上图中):
fig, axes = plt.subplots(ncols=4, nrows=3,\
sharex=True, sharey=True,\
subplot_kw=dict(adjustable='box-forced'))
其中adjustable='box-forced'
只是为了确保子图的平方,如here所述。
当我尝试为案例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()
一切似乎都很好:
我强迫情节axes[0][0].set_ylim(bottom=-941.238, top=-941.229)
当我尝试为Y2
绘制X
与Case 1
时,以下代码应该有效:我基本上和以前一样,但添加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]
图上没有显示任何数据。为什么会这样?
更新:优秀@ 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'
声明为平方:
我想知道为什么会这样?