2017-06-03 151 views
1

給定500x500像素的圖像我想在屏幕上顯示圖像1:1。另外我想要一個x和y軸。不縮放顯示圖像

  • plt.imshow()自動添加軸到我的圖像,並在窗口中心的圖像,但圖像被縮放和未示出爲我的屏幕上500x500像素。
  • fig.figimage()在我的屏幕上顯示圖像1:1,但不添加座標軸,並在窗口的左下角顯示圖像。特別是最大化窗口/調整窗口大小不會改變圖像的大小。

現在我需要的,是兩者的結合 - diplay圖片1:1樣fig.figshow確實,添加plt.imshow()增加軸和顯示中心像plt.imshow()做的圖像。

我該怎麼做? 或用其他術語說明:plt.imshow()如何顯示im image未縮放,如fig.figimage()呢?

示例代碼演示問題:使用plt.imshow()

import matplotlib.pyplot as plt 
import numpy as np 

width=500; 
height=500; 

# using plt.imshow() 
dummyImage = np.zeros((width, height)) 
plt.imshow(dummyImage) 
plt.show() 

# using fig.figimage() 
fig = plt.figure(figsize=(width, height)) 
fig.figimage(dummyImage) 
plt.show() 

結果不完全500x500像素和實際大小取決於窗口的大小。 enter image description here

使用fig.figimage():究竟500x500像素,獨立的窗口大小

enter image description here

+0

嘗試和轉換它到一個PNG,然後使用'IPython.display.Image'來顯示它。除此之外,我不知道一種讓它不成比例的方法。 – Polymer

+0

謝謝,但我想直接顯示它並儘可能使用matplotlib。 –

回答

1

,你需要做的的計算自己的一點點。假設您想在所有邊上使用50個像素邊距,並且您的dpi爲100,那麼您可以計算出數字尺寸爲figsize=((width+2*margin)/dpi, (height+2*margin)/dpi)英寸。然後你需要計算邊界,例如左邊框的邊距將被dpi除以數字寬度。您可以將計算出的圖形尺寸(figsize參數plt.figure())和邊框(使用subplots_adjust)設置爲您的圖形。

import matplotlib.pyplot as plt 
import numpy as np 

width=500 # pixels 
height=150 
margin=50 # pixels 
dpi=100. # dots per inch 

figsize=((width+2*margin)/dpi, (height+2*margin)/dpi) # inches 
left = margin/dpi/figsize[0] #axes ratio 
bottom = margin/dpi/figsize[1] 

fig = plt.figure(figsize=figsize, dpi=dpi) 
fig.subplots_adjust(left=left, bottom=bottom, right=1.-left, top=1.-bottom) 

dummyImage = np.zeros((height, width)) 
plt.imshow(dummyImage) 
plt.show() 

enter image description here

注意,具有尺寸的圖像的寬度和width高度height,需要陣列np.zeros((height, width)),而不是相反。

爲了確保數字保持其原來的大小,可以添加以下代碼,重新調整這個數字恢復到原來的大小對每一個試圖改變數字大小:

def update(event=None): 
    fig.set_size_inches(figsize) 

update() 
ci = fig.canvas.mpl_connect("resize_event", update) 
plt.show() 
+0

謝謝您的詳細回覆!這已經很接近了,但是這個widht似乎是500,包括tiks(y軸上的標記)。我只需要500圖像本身。你知道一種方法來確保圖形在最大化窗口時不會調整大小嗎? –

+0

寬度應該是沒有刻度的寬度。可以看到使用'savefig'導出圖形時這是正確的。現在似乎確實存在一個問題,即窗口可能會在創建時重新調整圖形的大小。這似乎就是這種情況,使用QtAgg後端。它不會發生使用TkAgg後端。你會很樂意使用Tk嗎? – ImportanceOfBeingErnest

+0

我添加了'import matplotlib matplotlib.use('TkAgg')',但是圖像距離500 px很遠。任何想法可能導致這種情況?我試着添加代碼以保持原來的尺寸。這在使用TkAgg的時候與打開窗口時的大小相同,但是圖像尺寸仍然大於500像素。 –