2010-11-17 93 views
1

爲清晰起見進行了編輯:MATLAB可以生成,保存並動態加載軸到GUI軸對象嗎?

我有一個GUI,用於控制生成大約40個繪圖的腳本。我想通過在下拉框中選擇它的編號,按需在GUI窗口中顯示任何給定的繪圖。問題是繪圖需要一段時間才能生成,因此我寧願將它們製作一次,然後根據需要將它們加載到GUI中的軸對象中。每個地塊都有不同的屬性,標籤,傳說等。

我試圖生成數字,然後保存它們,並試圖加載到GUI對象的軸,它沒有工作。

如果我最初用做軸的GUI對象爲目標軸我無法保存的情節和傳說等情節..

在MATLAB這可能嗎?

+0

我不確定我是否按照你的問題,但也許這是相關的:http://stackoverflow.com/questions/4008880/producing-subplots-to-then-combine-them-into-a-figure-later -matlab – Amro 2010-11-17 00:31:22

+0

你的問題不清楚; 「如果我將軸對象設置爲當前軸,我無法保存繪圖/數據」是什麼意思?無論如何,你是否考慮保存數據本身(例如x,y對)而不是軸對象?您是否看過Matlab文檔中的示例:http://www.mathworks.com/help/techdoc/creating_guis/bqz79mu.html – 2010-11-17 08:52:02

回答

0

您需要知道圖中軸的手柄。否則,如果圖形包含較新的軸對象,則很難更改軸屬性,因爲gca將引用新軸。

通過圖形對象可以對圖形生成後的軸進行訪問,因爲圖形的各個軸是圖形對象的子對象。以下代碼片段可能會對您有所幫助。

close all 

subplot(2,1,1) 
subplot(2,1,2) 

hAxes = get(gcf, 'Children') 

get(hAxes(1)) %shows axes properties of one axes obj 
get(hAxes(2)) %shows axes properties of the other 

set(hAxes(1), 'YTickLabel', ['a';'b';'c';'d';'e';'f']) %set an axis property 
1

如果我理解正確的問題,你必須用斧頭GUI和回調繪製的東西到軸。出於某種原因,例如因爲繪圖需要一段時間,所以您希望能夠保存特定的繪圖並且能夠重新加載它。

處理這個問題最簡單的方法是不要將軸對象放入GUI中,而是使用雙窗口GUI,其中一個窗口具有所有控件,另一個窗口是您繪製的圖形東東。這是有利的,原因如下:保存/加載變得容易,您可以訪問數字工具欄,並且可以根據需要調整圖形的大小(調整GUI大小通常是多毛的)。您可以通過SETAPPDATA將句柄存儲在GUI句柄結構中的圖形軸上,並通過GETAPPDATA訪問它。請注意,您需要在繪圖回調開始時進行一次小檢查,在這裏您使用軸柄上的ISHANDLE檢查該圖是否仍然存在,如果檢查返回false,則打開一個新圖。

如果您真的想在您的GUI中使用一個軸對象,最簡單的方法就是保存x和y數據以及用戶可以自定義的圖的其他屬性(圖例是開或關,或圖例的position屬性),以便您可以即時重新生成它。

如果由於某些原因不足以保存屬性,則可以生成一個隱藏圖形,並使用COPYOBJ將座標軸及其子圖複製到該圖中,然後保存該圖。然而,這很笨拙,可能會帶來各種令人驚訝的煩惱。

+0

是的,您對問題有正確的理解。我有代碼生成~40個地塊,每個都需要一段時間才能完成。我希望我可以使用兩個窗口的GUI,但我堅持一個窗口。我會嘗試你的第二個建議以及下面的gnovice。 – 2010-11-18 14:43:41

0

我在這裏猜測,但它聽起來像你想要創建一個軸顯示不同的情節,傳說等基於下拉菜單中的哪一項被選中的GUI。如果這是正確的,我猜你遇到的問題是在軸上繪製一組新數據會導致舊數據被替換,這使得每次選擇新菜單時必須重新生成整個繪圖項目。

我會考慮解決這個問題的一種方法是利用圖形對象的UIPANELs'Visible' property。您可以爲每個菜單項創建一個面板,爲每個菜單項添加一個軸以及任何想要繪製的數據,然後使用SET命令簡單切換面板的可見性,而不是在選擇新菜單項時重新繪製所有內容。這裏有一個例子:

hFigure = figure;      %# Create a figure 

hPanelA = uipanel('Parent',hFigure); %# Add panel A to the figure 
hAxesA = axes('Parent',hPanelA);  %# Add an axes to panel A 
plot(hAxesA,1:10,rand(1,10),'r');  %# Plot a red line 
text(5,0.5,'hello','Parent',hAxesA); %# Plot some text 
legend(hAxesA,'red line');   %# Add a legend 

hPanelB = uipanel('Parent',hFigure); %# Add panel B to the figure 
hAxesB = axes('Parent',hPanelB);  %# Add an axes to panel B 
plot(hAxesB,1:10,rand(1,10),'b');  %# Plot a blue line 
text(5,0.5,'world','Parent',hAxesB); %# Plot some text 
legend(hAxesB,'blue line');   %# Add a legend 

現在,你可以使面板可見和B組做隱形以下:

set([hPanelA hPanelB],{'Visible'},{'on'; 'off'}); 

你可以做反向(隱藏面板A和顯示板B)通過這樣做:

set([hPanelA hPanelB],{'Visible'},{'off'; 'on'}); 

你應該注意到,這兩個板之間的反覆與他們的兩個獨立的軸是快速平穩,這可能不會是如果你要擦除和重繪我的數據的情況下每當你想看一個新的情節,每一次都有一組軸。在創建GUI時創建所需的所有圖形對象,然後根據需要使用SET命令修改可見性(或其他屬性),可以獲得更高效的GUI。

另外請注意,您仍然可以修改對象屬性,即使他們是看不見的,所以(從我上面的例子繼續)我可以做這樣的事情:

set([hPanelA hPanelB],{'Visible'},{'on'; 'off'}); %# Hide panel B 
set(hPanelB,'BackgroundColor','b');    %# Change the color of panel B 
set([hPanelA hPanelB],{'Visible'},{'off'; 'on'}); %# Show panel B 

現在你應該看到的是,背景顏色面板B是藍色的。如果您還將handles保存到您的繪製線條和文本中,則可以在使它們再次可見之前使用新值更新它們。

+0

謝謝,我之前沒有使用過UIPANELS。我會嘗試在我的GUI中添加面板。 – 2010-11-18 14:51:59

+0

@R Biser:如果您確實嘗試使用UIPANELs,您可能需要修改代碼以切換其可見性,因爲您將擁有〜40個面板。我建議先把所有的UIPANEL句柄放在一個向量中,比如'hPanels = [h1 h2 ... h39 h40];'。然後,一個簡單的方法,你可以使面板'我'可見將被設置(hPanels,'可見','關');集(hPanels(i)中, '可見', '上');的DrawNow;'。 – gnovice 2010-11-18 15:09:50