我想创建一个带有两个 x 轴和两个 y 轴的图。我正在使用 twiny 和 twinx 来做到这一点。辅助轴只是原始轴的重新缩放,因此我正在应用转换来获取刻度。问题是我是对数比例,所以刻度之间的间隔在原始和双斧之间不匹配。此外,第二个 x 轴还有我不想要的其他值。让我们通过一个例子来更好地解释:
#define the transformations I need
h=0.67
def trasf_log(y):
y_ = 10**y
return y_/h
def trasf_sigma(x):
return 1.68/x
#plot in log scale and with ticks that I choose
fig,ax = plt.subplots(1)
ax.plot(x,y0)
ax.set_ylim(1.0,2.4)
ax.set_xlim(0.6,5)
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xticks([0.6,0.8,1,2,3,4])
ax.set_yticks([1.0,1.2,1.4,1.6,1.8,2.0,2.2,2.4])
ax.xaxis.set_major_formatter(ScalarFormatter())
ax.yaxis.set_major_formatter(ScalarFormatter())
ax.ticklabel_format(axis='both', style='plain')
ax.set_xlabel(r'$\nu$', fontsize=20)
ax.set_ylabel(r'$\log_{10}Q$', fontsize=20)
ax.tick_params(labelsize=15)
#create twin axes
ax1 = ax.twinx()
ax1.set_yscale('log')
ymin,ymax=ax.get_ylim()
ax1.set_ylim((trasf_log(ymin),trasf_log(ymax)))
ax1.set_yticks(trasf_log(ax.get_yticks()))
ax1.yaxis.set_major_formatter(ScalarFormatter())
ax1.ticklabel_format(axis='y', style='plain')
ax1.tick_params(labelsize=15,labelleft=False,labelbottom=False,labeltop=False)
ax1.set_ylabel(r'$Q$', fontsize=20)
ax2 = ax.twiny()
ax2.set_xscale('log')
xmin,xmax=ax.get_xlim()
ax2.set_xlim((trasf_sigma(xmin),trasf_sigma(xmax)))
ax2.set_xticks(trasf_sigma(ax.get_xticks()))
ax2.xaxis.set_major_formatter(ScalarFormatter())
ax2.ticklabel_format(axis='x', style='plain')
ax2.tick_params(labelsize=15,labelleft=False,labelbottom=False,labelright=False)
ax2.set_xlabel(r'$\sigma $', fontsize=20)
ax.grid(True)
fig.tight_layout()
plt.show()
这就是我得到的:
新的 x 和 y 轴的值与原始值不对齐。例如,在两个 x 轴上,值 1 和 1.68 应该对齐。y 轴也一样:1.2 和 23.7 应该对齐。此外,我不明白第二个 x 轴上的其他数字来自哪里。我已经尝试使用“普通”样式将标量格式化程序应用于每个轴,但没有任何变化。我也尝试使用secondary_axis,但我也找不到解决方案。
有人知道解决方案吗?