我知道这个线程已经死了很长一段时间,但我认为发布我的解决方案可能有助于任何人试图找出如何有效地绘制对数级箭头。
作为别人已发布内容的替代方案,您可以使用transformation object来输入不是原始轴比例的箭头坐标,而是以“轴坐标”的(线性)比例输入。我所说的轴坐标是指那些通过[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发布的原始代码以实现下面的内容(道歉不包括代码生成的图像,我没有所需的声望)。
#!/usr/bin/python3
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# functions fx and fy take log-scale coordinates to 'axes' coordinates
ax = 1E-12 # [ax,bx] is range of horizontal axis
bx = 1E0
def fx(x):
return (np.log(x) - np.log(ax))/(np.log(bx) - np.log(ax))
ay = 1E-20 # [ay,by] is range of vertical axis
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)
# transformed coordinates for arrow from (1E-10,1E-18) to (1E-4,1E-16)
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, # input transformed arrow coordinates
transform = plot1.transAxes, # tell matplotlib to use axes coordinates
facecolor = 'black',
length_includes_head=True
)
plt.grid(True)
plt.savefig('test.pdf')
似乎是matplotlib的问题。尝试'plt.arrow(6e-4,1e-4,0.1,0.2,length_includes_head = True)'并将视图移到y的更高值。你会看到箭头线大约从10-4开始。但是,如果您使用较低的值(即对于x和y,则为1e-5),线消失,并且您只能看到大部分与以前相同的小箭头。 (显然,你应该使用plt.show()来做到这一点) – joaquin 2012-08-02 17:24:54
那么是否有任何解决方法? – janoliver 2012-08-02 17:47:20
如果我知道我会写一个答案;-)。但现在至少你知道箭头在那里...... – joaquin 2012-08-02 17:51:42