在我的图中,辅助x轴用于显示某些数据的另一个变量的值。现在,原始轴是对数缩放的。不幸的是,孪生轴将刻度(和标签)放在原始轴的线性尺度上,而不是按照预期的对数尺度。如何克服这个问题?
下面的代码示例应该将孪生轴的刻度放在与原始轴相同的(绝对轴)位置:
def conv(x):
"""some conversion function"""
# ...
return x2
ax = plt.subplot(1,1,1)
ax.set_xscale('log')
# get the location of the ticks of ax
axlocs,axlabels = plt.xticks()
# twin axis and set limits as in ax
ax2 = ax.twiny()
ax2.set_xlim(ax.get_xlim())
#Set the ticks, should be set referring to the log scale of ax, but are set referring to the linear scale
ax2.set_xticks(axlocs)
# put the converted labels
ax2.set_xticklabels(map(conv,axlocs))
另一种方法是(刻度不会设置在相同的位置,但这并不重要):
from matplotlib.ticker import FuncFormatter
ax = plt.subplot(1,1,1)
ax.set_xscale('log')
ax2 = ax.twiny()
ax2.set_xlim(ax.get_xlim())
ax2.xaxis.set_major_formatter(FuncFormatter(lambda x,pos:conv(x)))
只要不使用对数标度,这两种方法都能很好地工作。
也许有一个简单的修复方法。我在文档中遗漏了什么吗?
作为一种变通方法,我尝试获取ax的刻度的ax.transAxes坐标,并将刻度放在ax2中的相同位置。
ax2.set_xticks(axlocs,transform=ax2.transAxes)
TypeError: set_xticks() got an unexpected keyword argument 'transform'
3条答案
按热度按时间piah890a1#
这个问题已经问了一段时间了,但我被同样的问题绊倒了。
我最终通过引入一个logscaled(
semilogx
)透明(alpha=0
)虚拟图来解决这个问题。范例:
在上面的例子中,垂直线表明第一和第二轴确实按照需要彼此移动。
x = 100
被移动到z = 2*x**0.5 = 20
。颜色只是为了澄清哪条垂直线与哪条轴相对应。ggazkfy82#
不需要覆盖它们,只要消灭蜱虫!
pgky5nke3#
我想你可以通过调用
ax2.set_xscale('log')
来解决你的问题。