1 回答

TA貢獻1775條經驗 獲得超8個贊
簡單的解決方案是按照@JohanC 的建議進行操作并計算對數坐標的中點。
另一種解決方案是使用箭頭的坐標來找到它的中點。然而,這種方法也有缺點。首先,您需要在中間步驟顯式繪制圖形,因為坐標僅在繪制時有效,其次,您需要在繪制注釋之前設置對數比例。另一方面,無論軸的縮放如何,代碼都可以工作
import numpy as np
import matplotlib.pyplot as plt
# Dimension line
def annotation_line(ax, xmin, xmax, y, text, ytext=0, linecolor='black', linewidth=1, fontsize=12):
an = ax.annotate('', xy=(xmin, y), xytext=(xmax, y), xycoords='data', textcoords='data', arrowprops={'arrowstyle': '|-|', 'color':linecolor, 'linewidth':linewidth})
ax.annotate('', xy=(xmin, y), xytext=(xmax, y), xycoords='data', textcoords='data', arrowprops={'arrowstyle': '<->', 'color':linecolor, 'linewidth':linewidth})
ax.figure.canvas.draw() # draw to get actual coordinates
p = an.arrow_patch.get_path().transformed(ax.transAxes.inverted())
xmin, xmax = np.min(p.vertices[:,0]),np.max(p.vertices[:,0])
xcenter = xmin+(xmax-xmin)/2
if ytext==0:
ytext = y + ( ax.get_ylim()[1] - ax.get_ylim()[0] ) / 20
ax.annotate(text, xy=(xcenter, ytext), xycoords=('axes fraction','data'), ha='center', va='bottom', fontsize=fontsize)
return an
# Toy data
N = 8
y = np.zeros(N)
x1 = np.linspace(1, 1000, N, endpoint=True)
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x1, y, 'o')
ax.set_xscale('log') # must do before the call to annotation_line
an = annotation_line(ax=ax, text='TEXT 1', xmin=1, xmax=100, y=0.01, ytext=0, linewidth=1, linecolor='gray', fontsize=12)
添加回答
舉報