[英]Python matplotlib, get position of xtick labels
我如何獲得xtick主要標簽的位置? 我從label.get_position()獲得的值沒有意義。
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
# fig, ax = plt.figure(1)
fig, ax = plt.subplots()
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
# plt.show()
print(fig)
print(ax.get_position())
# ------------------------------------------------
# positions of the tick labels, incorrect (0,0) returned
# ------------------------------------------------
print([text.get_position() for text in ax.get_xticklabels()])
# correct tick label values
print(ax.get_xticks())
上面代碼的輸出是:
Figure(640x480)
Bbox('array([[ 0.125, 0.1 ],\n [ 0.9 , 0.9 ]])')
[(0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (0.0, 0.0)] <-- incorrect positions
[ 0. 1. 2. 3. 4. 5.]
我如何獲得xtick主要標簽的位置? 我從label.get_position()獲得的值沒有意義。 有一種我不知道的轉變嗎? 最終我想要(x,y)圖像像素單位中文本框的位置。
如果需要像素坐標,則需要圖形坐標,然后對其進行轉換。
如果您需要有關轉換的更多信息:請查看此matplotlib轉換教程: ref
編輯:為了完整性,我添加了指定dpi的選項,這將影響您的圖形尺寸
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
# set the dpi you want in your final figure
dpi = 300
mpl.rcParams['figure.dpi'] = dpi
fig, ax = plt.subplots()
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
# saving the figure: don't forget the dpi option!
fig.savefig('./out.png', format='png', dpi=dpi)
xtickslocs = ax.get_xticks()
ymin, _ = ax.get_ylim()
print('xticks pixel coordinates')
print(ax.transData.transform([(xtick, ymin) for xtick in xtickslocs]))
print('label bounding boxes')
print([l.get_window_extent() for l in ax.get_xticklabels()])
xticks pixel coordinates
array([[ 60. , 40. ],
[ 134.4, 40. ],
[ 208.8, 40. ],
[ 283.2, 40. ],
[ 357.6, 40. ],
[ 432. , 40. ]])
label bounding boxes
[Bbox([[56.4375, 25.5555555556], [63.5625, 35.5555555556]]),
Bbox([[130.8375, 25.5555555556], [137.9625, 35.5555555556]]),
Bbox([[205.2375, 25.5555555556], [212.3625, 35.5555555556]]),
Bbox([[279.6375, 25.5555555556], [286.7625, 35.5555555556]]),
Bbox([[354.0375, 25.5555555556], [361.1625, 35.5555555556]]),
Bbox([[428.4375, 25.5555555556], [435.5625, 35.5555555556]])]
由於您需要“(x,y)中文本框的位置”,在評論/代碼中根據您的請求調整此答案 ,我們有:
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
# fig, ax = plt.figure(1)
fig, ax = plt.subplots()
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
print(fig)
print(ax.get_position())
plt.gcf().canvas.draw()
ticks = [tick for tick in plt.gca().get_xticklabels()]
for i, t in enumerate(ticks):
print("Label ", i, ", data: ", t.get_text(), " ; ", t.get_window_extent())
print(ax.get_xticks())
plt.show()
哪個印刷品:
>>>
RESTART: C:/Users/Vinicius/AppData/Local/Programs/Python/Python35-32/stack21.py
Figure(640x480)
Bbox(x0=0.125, y0=0.10999999999999999, x1=0.9, y1=0.88)
Label 0 , data: ; Bbox(x0=102.54545454545455, y0=43.077777777777776, x1=102.54545454545455, y1=43.077777777777776)
Label 1 , data: 0 ; Bbox(x0=98.17045454545455, y0=29.077777777777776, x1=106.92045454545455, y1=43.077777777777776)
Label 2 , data: 1 ; Bbox(x0=188.65194870390656, y0=29.077777777777776, x1=197.52694870390656, y1=43.077777777777776)
Label 3 , data: 2 ; Bbox(x0=279.25844286235855, y0=29.077777777777776, x1=288.00844286235855, y1=43.077777777777776)
Label 4 , data: 3 ; Bbox(x0=369.80243702081054, y0=29.077777777777776, x1=378.55243702081054, y1=43.077777777777776)
Label 5 , data: 4 ; Bbox(x0=460.34643117926254, y0=29.077777777777776, x1=469.09643117926254, y1=43.077777777777776)
Label 6 , data: 5 ; Bbox(x0=550.8904253377145, y0=29.077777777777776, x1=559.6404253377145, y1=43.077777777777776)
Label 7 , data: ; Bbox(x0=102.54545454545455, y0=43.077777777777776, x1=102.54545454545455, y1=43.077777777777776)
[-1. 0. 1. 2. 3. 4. 5. 6.]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.