Matplotlib 对数尺度下xy坐标的变换

Matplotlib 对数尺度下xy坐标的变换,matplotlib,transform,Matplotlib,Transform,这是我想做的一件简单的事情 newcoords = ax.transLimits.transform( np.array(oldcoords)) ) 为了将坐标从数据坐标oldcoords转换为绘图轴坐标newcoords。我的绘图有一个线性比例的轴,另一个是对数比例的轴。与线性刻度(例如x)对应的分量已正确转换,但与对数刻度(例如y)对应的分量未正确转换 我试过了,但没用,我该怎么做 transInstance = ax.transLimits + ax.transScale newcoor

这是我想做的一件简单的事情

newcoords = ax.transLimits.transform( np.array(oldcoords)) )
为了将坐标从数据坐标
oldcoords
转换为绘图轴坐标
newcoords
。我的绘图有一个线性比例的轴,另一个是对数比例的轴。与线性刻度(例如
x
)对应的分量已正确转换,但与对数刻度(例如
y
)对应的分量未正确转换

我试过了,但没用,我该怎么做

transInstance = ax.transLimits + ax.transScale
newcoords = transInstance.transform( oldcoords )

您需要清楚您正在对数据进行哪些转换。假设你有旧坐标x,y中的数据,对吗。然后转换到一些新坐标x'和y',并根据log(y')绘制x'

如果是这种情况,那么当找到最小值时,您将在x'-log(y')空间中有一个点,然后需要在这些坐标中绘制一个矩形


如果我误解了,我很抱歉,但我建议您完整地写下您所做的转换,并记住顺序很重要

我可能会在聚会上迟到,但在谷歌搜索了很多次之后,我很难找到答案,所以我认为这可能对其他人还是有帮助的

坐标变换必须以稍微不同的方式进行;必须交换转换或嵌套两个转换。请注意,如果轴是线性的而不是对数的,则这似乎是不必要的

例如,以该图为例:

fig, ax = plt.subplots(1, 1)
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_yscale('log')
然后,如果要变换[10,10]点的坐标,必须嵌套两个变换:

>>> ax.transLimits.transform(ax.transScale.transform([10, 10]))
array([1.        , 0.99800598])
或对变换求和,但顺序相反:

>>> newTransform = ax.transScale + ax.transLimits
>>> newTransform.transform([10, 10])
array([1., 1.])


在另一个答案中可以找到更多的见解:

你能为你要做的事情提供更多的背景吗?似乎应该有一种更简单的方法来实现最终目标。好吧,但上下文有点复杂,我认为这并不重要:我用
pcolormesh
创建了一个图,这个图有一个线性比例的轴,另一个是对数比例的轴,我发现这个图的最小值,想要通过在最小值的位置绘制一个矩形来标记这个最小值,但是,由于对数比例,如果我在数据坐标中绘制矩形,它的形状很难看,因此我想在绘图坐标中绘制它,也就是说,给它一个可读的独立于数据的大小,所以我需要这个转换,这应该是一件容易的事情,但我猜我做错了…简言之:我想画一个以选定数据区域为中心的矩形,但其大小与绘图的大小有关,例如,宽度和高度等于绘图的5%,独立于它的中心位置,您可以在数据坐标中进行此操作,只需垂直移动中心,以便所需点上方和下方边缘距离的对数相等。您可以不使用单独的轴缩放,通过ax.setxscale和ax.setyscale方法?嗯。。。比这简单多了;)我有x,y,然后以对数比例绘制y,所以matplotlib为我做这个转换:x'=x,y'=log(y)。然后我在x,y坐标中找到一个点,然后想画一个矩形,或者在x',y'坐标中,或者在绘图坐标中,基本上等于x',y'。我知道我可以手动计算这个矩形的大小,但是必须有一种更简单的方法,使用matplotlib命令。好的,很抱歉,我误解了,以为您有两个转换。我的道歉。