【发布时间】:2013-12-05 09:32:39
【问题描述】:
在我的绘图中,辅助 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'
【问题讨论】:
-
我有点不清楚您的实际问题是什么,如果您可以添加一些随机数据甚至是显示问题的图表,这将是有帮助的。您是否考虑过仅对第二个变量进行对数缩放?
-
感谢您的回复。这也是我的第一个想法。但是,设置 ax2.set_xscale('log') 不起作用。它根据标签对刻度重新排序。因此,与数据和 ax 的连接丢失。我会尽快用一些图来说明这个问题。
-
不,我的意思是实际记录值本身——这样更容易理解发生了什么。
-
那肯定行得通,因为线性刻度仍然存在。然而,这并不是我的目标。我更喜欢物理值(磁场梯度强度)的对数图,而不是对数值的线性图。因为在后一种情况下,观察者不能直接看到梯度强度,而是首先需要应用指数。
标签: python matplotlib