Matplotlib寄生对数轴刻度不必要的镜像

5 投票
1 回答
859 浏览
提问于 2025-04-18 10:41

我正在尝试使用mpl_toolkits.axes_grid1中的host_subplot来绘制一个有两个y轴的图表,其中一个是对数轴,另一个是线性轴。图表看起来还不错,但有个问题,就是右侧的次要y轴(对数轴)的刻度线也出现在左侧的主要y轴上,而且是在图表的内部。

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA

host = host_subplot(111)
host.set_yticks(np.arange(-12, -3, 1.0))

par1 = host.twinx()
par1.set_ylim( 2.7040e+3, 1.3552e+7)
par1.set_yscale('log')

minorLocator_x1 = MultipleLocator(0.3333)
minorLocator_y1 = MultipleLocator(0.5)
host.xaxis.set_minor_locator(minorLocator_x1)
host.yaxis.set_minor_locator(minorLocator_y2)

图表看起来是这样的。你可以看到右侧的y轴刻度在左侧y轴上也出现了。

我可以通过以下方法解决这个次要对数轴刻度线重复的问题:

host = host_subplot(111, axes_class=AA.Axes)

不过,这又引发了另一个问题,就是x轴的刻度标签也显示在图表的内部,连x轴的标签也是。

即使我尝试手动调整,x轴的标签也不会移动。

有没有什么办法可以解决这些问题呢?

1 个回答

2

我找到了一种解决这个问题的方法,但不是通过使用mpl_toolkits.axes_grid1中的host_subplot。相反,我使用了matplotlib的坐标轴,代码如下:

fig, ax1 = plt.subplots()

ax1.set_xlim(-0.25, 5.1)
ax1.set_ylim(-3.75, -13)
ax2=ax1.twinx()

ax1.set_xlabel('X-label', fontdict=font)
ax1.set_ylabel('Y1-label$', rotation='horizontal', fontdict=font)
ax2.set_ylabel('Y2-label', rotation='horizontal', fontdict=font)

ax2.set_ylim(2.7040e+3,  1.3552e+7)
ax2.set_yscale('log')
ax1.set_yticks(np.arange(-12, -3, 1.0))

ml = MultipleLocator(0.5)
minorLocator = MultipleLocator(0.3333)
ax1.xaxis.set_minor_locator(minorLocator)
ax1.yaxis.set_minor_locator(ml)

这样就能生成正确的图表。看起来之前的问题是因为在第一种情况下(没有使用axes_class=AA.Axes的host_subplot)对刻度的设置不太清晰(set_minor_locator)。

撰写回答