2016-07-20 61 views
4

我正在尋找的正是對準(重疊),我的形象的角落邊緣與文本框邊緣的角落和邊緣(BBOX或其他方式)的方式對齊文本框邊緣與圖像的角落

的有問題的代碼是:

import numpy as np 
import matplotlib.pyplot as plt 
fig, ax = plt.subplots(1) 
ax.imshow(np.random.random((256,256)), cmap=plt.get_cmap("viridis")) 
ax.axis("off") 

ax.annotate(
    s = 'image title', 
    xy=(0, 0), 
    xytext=(0, 0), 
    va='top', 
    ha='left', 
    fontsize = 15, 
    bbox=dict(facecolor='white', alpha=1), 
    ) 
plt.show() 

Single image

正如你所看到的,文本框的邊緣在圖像之外。對於我的生活,我無法找到將文本框的角落與圖像的角落對齊的一致方式。理想情況下,我希望對齊獨立於字體大小和圖像像素大小,但這可能會有點太多。

最後,我想用一個網格圖像實現這一點,就像下面的第二個例子。

import numpy as np 
import matplotlib.pyplot as plt 
fig = plt.figure(figsize=(8, 8)) 
images = 4*[np.random.random((256,256))] 

gs = gridspec.GridSpec(
    nrows=2, 
    ncols=2, 
    top=1., 
    bottom=0., 
    right=1., 
    left=0., 
    hspace=0., 
    wspace=0., 
) 
for g, i in zip(gs, range(len(images))): 
    ax = plt.subplot(g) 
    im = ax.imshow(
     images[i], 
     cmap=plt.get_cmap("viridis") 
    ) 
    ax.set_xticks([]) 
    ax.set_yticks([]) 
    ax.annotate(
     s = 'image title', 
     xy=(0, 0), 
     xytext=(0, 0), 
     va='top', 
     ha='left', 
     fontsize = 15, 
     bbox=dict(facecolor='white', alpha=1), 
    ) 

enter image description here

+2

使用'clip_on = TRUE'作爲參數到'ax.annotate'將剪輯的文本框中的軸限制。也許這有助於(?)。 –

回答

2

問題從邊框的填充造成的。您可以通過將pad參數傳遞給邊界框字典來更改填充(例如,pad = 0將使框保留在座標軸內)。我假設你想要一些填充,所以最好設置一個填充參數,並將其從註釋位置(以像素爲單位)中移除。

+1

謝謝,你確切地點。如果沒有'xytext'偏移量,'pad = 1'會給出一個對齊的邊緣,所以我必須考慮使用'xytext'來進行額外的添加。我已經根據您的建議修正了我的代碼,並添加了一個解決方案。 – TomNorway

2

感謝解決方案的P-robot。解決方案的關鍵部分是註釋文本邊緣將x和y從xy座標偏移一個像素。任何額外的填充使用增加必要的數量來補償這個偏移量。下面給出的第二組參數ax.annotate是相關的。

fig, ax = plt.subplots(1) 
ax.imshow(np.random.random((256,256)), cmap=plt.get_cmap("viridis")) 
ax.axis("off") 

padding = 5 
ax.annotate(
    s = 'image title', 
    fontsize = 12, 

    xy=(0, 0), 
    xytext=(padding-1, -(padding-1)), 
    textcoords = 'offset pixels', 
    bbox=dict(facecolor='white', alpha=1, pad=padding), 
    va='top', 
    ha='left', 
    ) 
plt.show() 

Aligned image

奇怪的是,對於四個圖像的網格,在x方向上偏移並不需要一個像素,從而改變xytextxytext=(padding, -(padding-1))的減法。

Aligned grid of four images