2011-05-19 38 views
3

我在wxpython面板上的canvas上有一個matplotlib圖形。我的應用程序是實時運行的,用戶可以重新調整窗口大小。但是,當發生這種情況時,我的軸周圍的邊界就會失去控制。Python/Matplotlib - wxPython中的圖邊框

我知道我可以使用函數fig.subplots_adjust來調整邊界,但函數中指定的值是百分比,所以當最大化時,邊界周圍會出現浪費空間的TON,即使空間恰到好處當窗戶較小時。

是否有類似於這個功能的地方,我可以指定像像素這樣的邊框,以便無論框架的尺寸是多少,邊框都是相同的寬度?

一如既往,謝謝!

回答

5

下面是一個如何做到這一點的例子。該代碼定義了一個函數,該函數根據當前圖形大小將像素邊界值轉換爲百分比。它還掛接了一個事件監聽器,可在調整圖形大小時調整邊框:

import numpy 
import matplotlib.pyplot as plt 

def adjust_borders(fig, targets): 
    "Translate desired pixel sizes into percentages based on figure size." 
    dpi = fig.get_dpi() 
    width, height = [float(v * dpi) for v in fig.get_size_inches()] 
    conversions = { 
     'top': lambda v: 1.0 - (v/height), 
     'bottom': lambda v: v/height, 
     'right': lambda v: 1.0 - (v/width), 
     'left': lambda v: v/width, 
     'hspace': lambda v: v/height, 
     'wspace': lambda v: v/width, 
     } 
    opts = dict((k, conversions[k](v)) for k, v in targets.items()) 
    fig.subplots_adjust(**opts) 

fig = plt.figure(figsize=(7, 5)) 
for i in range(4): 
    ax = fig.add_subplot(2, 2, i+1) 
    ax.plot([1,2,3], [4,5,1]) 
    ax.set_xticks([]) 
    ax.set_yticks([]) 

# target sizes in pixels. 
targets = dict(left=10, right=10, top=10, bottom=30, hspace=30, wspace=30) 
# hook up a function to adjust the borders when the window is resized 
fig.canvas.mpl_connect('resize_event', lambda e: adjust_borders(fig, targets)) 
adjust_borders(fig, targets) 
plt.show() 
+0

真棒,謝謝。希望有一個內置的函數來基本爲我們做這件事(看起來這將是一個普遍的要求?),但這也很有效。 – 2011-05-20 17:38:02

+0

很酷,很高興這很有幫助。我同意這應該建立在 - 當我將圖形渲染爲PNG時,更容易設置像素的大小,並且在更改分辨率時必須重新計算百分比,這有點痛苦。 – samplebias 2011-05-20 17:56:40