2017-05-08 87 views
2

我想寫一個函數來自動放置在我的數字右下角的水印。這是我迄今的功能。Matplotlib自動放置水印

from PIL import Image 
import matplotlib.pyplot as plt 

def watermark(fig, ax): 

    """ Place watermark in bottom right of figure. """ 

    # Get the pixel dimensions of the figure 
    width, height = fig.get_size_inches()*fig.dpi 

    # Import logo and scale accordingly 
    img = Image.open('logo.png') 
    wm_width = int(width/4) # make the watermark 1/4 of the figure size 
    scaling = (wm_width/float(img.size[0])) 
    wm_height = int(float(img.size[1])*float(scaling)) 
    img = img.resize((wm_width, wm_height), Image.ANTIALIAS) 

    # Place the watermark in the lower right of the figure 
    xpos = ax.transAxes.transform((0.7,0))[0] 
    ypos = ax.transAxes.transform((0.7,0))[1] 
    plt.figimage(img, xpos, ypos, alpha=.25, zorder=1) 

問題是,當我向任一軸添加標籤時,水印的位置發生變化。例如。顯着增加ax.set_xlabel('x-label', rotation=45)改變水印位置。這似乎是這種情況,因爲水印的放置與整個圖形相關(例如繪圖和軸線區域),然而函數get_size_inches()僅計算繪圖區域(例如不包括軸線區域)。

有無論如何獲得整個圖形的像素尺寸(例如包括軸區域)或其他簡單的解決方法。

在此先感謝。

回答

2

您可能需要使用一個AnchoredOffsetbox,其中您放置了一個OffsetImage。優點是您可以使用loc=4參數將Offsetbox放置在軸的右下角(就像圖例一樣)。

from PIL import Image 
import matplotlib.pyplot as plt 
from matplotlib.offsetbox import (OffsetImage,AnchoredOffsetbox) 


def watermark2(ax): 
    img = Image.open('house.png') 
    width, height = ax.figure.get_size_inches()*fig.dpi 
    wm_width = int(width/4) # make the watermark 1/4 of the figure size 
    scaling = (wm_width/float(img.size[0])) 
    wm_height = int(float(img.size[1])*float(scaling)) 
    img = img.resize((wm_width, wm_height), Image.ANTIALIAS) 

    imagebox = OffsetImage(img, zoom=1, alpha=0.2) 
    imagebox.image.axes = ax 

    ao = AnchoredOffsetbox(4, pad=0.01, borderpad=0, child=imagebox) 
    ao.patch.set_alpha(0) 
    ax.add_artist(ao) 

fig, ax = plt.subplots() 
ax.plot([1,2,3,4], [1,3,4.5,5]) 

watermark2(ax) 
ax.set_xlabel("some xlabel") 
plt.show() 

enter image description here

+0

好極了!如果您想要每個子圖都有一個水印,請根據子圖大小縮放圖像,即「width = ax.bbox.xmax - ax.bbox.xmin」 – sfinkens

+0

@Funkensieper如果您想讓水印填充完整的軸,你可以使用圖像的「ax.imshow」圖,並設置你喜歡的zorder和alpha。 – ImportanceOfBeingErnest

+0

不,我希望水印是每個子圖的1/4。:) – sfinkens