2017-05-16 179 views
0

如何獲得xtick主要標籤的位置? 我從label.get_position()獲得的值沒有意義。從上面的代碼Python matplotlib,獲取xtick標籤的位置

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)圖像像素單位中的文本框的位置。

+0

嘿,我覺得這個【答案】(http://stackoverflow.com/a/42171199/5103802)可以解決您的問題! –

+0

當我運行該代碼時,我得到: 標籤0,數據:Bbox('array([[80.,43.55555556],\ n [80.,43.55555556]])')爲每行重複。 – Justin

+0

我試着用一些'labels =''Frogs','Hogs','Bogs','Slo​​gs'] * 12'的相同代碼,它按照預期的方式工作,輸出x0,y0,x1,y1。 –

回答

2

如果您需要像素座標,則需要圖形座標,然後對其進行變換。

如果您需要轉換的更多信息:選中此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]])] 
+0

這隻能轉化爲繪製數據空間的圖形,而不是圖像的x,y座標。在這裏看到文檔:https://matplotlib.org/users/transforms_tutorial.html – Justin

+0

有效點@Justin,我會相應地調整 – Daan

+0

上面的評論答案和下面的評論答案只有在嘗試下面的行之前嘗試訪問ax.get_xticklabels 1)plt.gcf()。canvas.draw() 2)fig.savefig('./ out.png',format ='png',dpi = dpi) – Justin

0

由於您需要「(x,y)中文本框的位置」,請在評論/代碼中將此answer更改爲您的請求,我們有:

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.] 
相關問題