我知道这个帖子已经很久没有更新了,但是我认为发布我的解决方案可能有助于其他人更有效地绘制对数比例图上的箭头。
作为其他人已经发布内容的替代方案,您可以使用一个转换对象,将箭头坐标输入到“轴坐标”的(线性)尺度上,而不是原始坐标轴的尺度。 我所说的轴坐标是指在[0,1](水平范围)和[0,1](垂直范围)之间标准化的坐标系,其中点(0,0)是左下角,点(1,1) 是右上角等等。 然后,您可以通过以下方式简单地包含一个箭头:
plt.arrow(0.1, 0.1, 0.9, 0.9, transform=plot1.transAxes, length_includes_head=True)
这将在图的水平和垂直范围的4/5上方斜跨箭头,从左下到右上(其中
plot1
是子图名称)。
如果您想在一般情况下执行此操作,可以在对数空间中为箭头指定精确坐标
(x0,y0)
和
(x1,y1)
,只需编写两个函数
fx(x)
和
fy(y)
即可将原始坐标转换为这些“轴”坐标。下面是如何修改OP发布的原始代码以实现此目的的示例(抱歉,我没有所需的声望来包含代码生成的图像)。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
ax = 1E-12
bx = 1E0
def fx(x):
return (np.log(x) - np.log(ax))/(np.log(bx) - np.log(ax))
ay = 1E-20
by = 1E-10
def fy(y):
return (np.log(y) - np.log(ay))/(np.log(by) - np.log(ay))
plot1 = plt.subplot(111)
plt.xscale('log')
plt.yscale('log')
plt.xlim(ax, bx)
plt.ylim(ay, by)
x0 = fx(1E-10)
y0 = fy(1E-18)
x1 = fx(1E-4) - fx(1E-10)
y1 = fy(1E-16) - fy(1E-18)
plt.arrow(
x0, y0, x1, y1,
transform = plot1.transAxes,
facecolor = 'black',
length_includes_head=True
)
plt.grid(True)
plt.savefig('test.pdf')
plt.arrow(6e-4, 1e-4, 0.1, 0.2, length_includes_head=True)
,并将视图移动到较高的y值。您会看到箭头线从约10-4开始。但是,如果您使用较低的值(即x和y的1e-5),则线条会消失,您只能看到小箭头头部大部分在之前的相同位置上。(显然,您应该使用plt.show()来执行此操作) - joaquin