我知道這個線程已經死了很長一段時間,但我認爲發佈我的解決方案可能有助於任何人試圖找出如何有效地繪製對數級箭頭。
作爲別人已發佈內容的替代方案,您可以使用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