Twiny() 轴未与下轴对齐 - matplotlib
Twiny() axis not aligned to lower axis - matplotlib
我希望你能帮我解决这个小问题。
我正在绘制三组误差线数组,我想在图的顶部有第二组刻度。因此,我创建了一个新的双轴,并为其提供了相同的刻度坐标,x
。 应该执行此操作的代码部分如下
x = np.arange(len(Stars))*2
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
ax1.errorbar(x-.5,[Jmin_IS[i] for i in Ind],yerr=[[J1sL_IS[i] for i in Ind],[J1sR_IS[i] for i in Ind]],fmt='o',ms=6)
ax1.errorbar(x ,[Jmin_OM[i] for i in Ind],yerr=[[J1sL_OM[i] for i in Ind],[J1sR_OM[i] for i in Ind]],fmt='s',ms=6)
ax1.errorbar(x+.5,[Jmin_CA[i] for i in Ind],yerr=[[J1sL_CA[i] for i in Ind],[J1sR_CA[i] for i in Ind]],fmt='^',ms=6)
for xv in np.arange(len(Stars))*4: ax1.axvspan(xv-1, xv+1, color='grey',alpha=.5)
x2labels = [str(r'N$_{\star}$=%i'%Stars[i]) for i in Ind]
ax1.set_xticks(x)
ax2.set_xticks(x)
ax2.set_xticklabels(x2labels, rotation=90)
ax1.set_ylim(15,21)
ax1.set_xlim(-1,39)
plt.tight_layout()
plt.grid(ls='dotted',axis='y')
plt.show()
结果如图
有两个问题:首先,双轴 ax2 刻度发生了偏移(N_star 数字相对于底部 x 轴的刻度未对齐)并且没有显示 y 方向的网格。
有人能找出错误吗?是 python 包版本的问题吗?非常感谢
顶部 y 轴和底部 y 轴的刻度线不对齐的问题是因为您更改了第一个轴的 x 数据限制。换句话说,您更改了一个轴的 "x-zoom",但未更改另一个轴的 "x-zoom",这导致刻度线未对齐。
如果你也写
ax2.set_xlim(-1,39)
那个问题就解决了。
至于y轴没有出现,可以用第一轴的grid
方法解决:
ax1.grid(ls='dotted',axis='y')
当您调用 plt.grid
(或 pyplot
中的任何其他方法)时,它将在最后一个活动轴上运行,在本例中为 ax2
。我不确定为什么 ax2.grid(axis='y')
不显示网格线,但这是一个简单的解决方案,只需在作为另一个基础的轴上使用该方法即可。
我希望你能帮我解决这个小问题。
我正在绘制三组误差线数组,我想在图的顶部有第二组刻度。因此,我创建了一个新的双轴,并为其提供了相同的刻度坐标,x
。
x = np.arange(len(Stars))*2
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
ax1.errorbar(x-.5,[Jmin_IS[i] for i in Ind],yerr=[[J1sL_IS[i] for i in Ind],[J1sR_IS[i] for i in Ind]],fmt='o',ms=6)
ax1.errorbar(x ,[Jmin_OM[i] for i in Ind],yerr=[[J1sL_OM[i] for i in Ind],[J1sR_OM[i] for i in Ind]],fmt='s',ms=6)
ax1.errorbar(x+.5,[Jmin_CA[i] for i in Ind],yerr=[[J1sL_CA[i] for i in Ind],[J1sR_CA[i] for i in Ind]],fmt='^',ms=6)
for xv in np.arange(len(Stars))*4: ax1.axvspan(xv-1, xv+1, color='grey',alpha=.5)
x2labels = [str(r'N$_{\star}$=%i'%Stars[i]) for i in Ind]
ax1.set_xticks(x)
ax2.set_xticks(x)
ax2.set_xticklabels(x2labels, rotation=90)
ax1.set_ylim(15,21)
ax1.set_xlim(-1,39)
plt.tight_layout()
plt.grid(ls='dotted',axis='y')
plt.show()
结果如图
有两个问题:首先,双轴 ax2 刻度发生了偏移(N_star 数字相对于底部 x 轴的刻度未对齐)并且没有显示 y 方向的网格。
有人能找出错误吗?是 python 包版本的问题吗?非常感谢
顶部 y 轴和底部 y 轴的刻度线不对齐的问题是因为您更改了第一个轴的 x 数据限制。换句话说,您更改了一个轴的 "x-zoom",但未更改另一个轴的 "x-zoom",这导致刻度线未对齐。 如果你也写
ax2.set_xlim(-1,39)
那个问题就解决了。
至于y轴没有出现,可以用第一轴的grid
方法解决:
ax1.grid(ls='dotted',axis='y')
当您调用 plt.grid
(或 pyplot
中的任何其他方法)时,它将在最后一个活动轴上运行,在本例中为 ax2
。我不确定为什么 ax2.grid(axis='y')
不显示网格线,但这是一个简单的解决方案,只需在作为另一个基础的轴上使用该方法即可。