2011-09-25 40 views
4

如何將滾動條添加到子圖中?在GUI中的子圖中添加滾動條

我經歷了許多教程走了,但他們似乎很難理解(例如:Scrolling Figure Demo

任何簡單的方法來實現?


我的代碼如下所示。它創建兩個數字,一個用於多個地塊,另一個用於子地塊。對於subplots我希望有滾動條,以便我可以將其滑下。 我不知道如何調用這個函數,如果我將addaxis的調用替換爲我的函數,那麼如何在不調用addaxis函數的情況下重新調整軸。

function readfile 
while(1) 

q = cell(16,2); 
q{1,1}='1B000003AC63A328.txt'; % sensor 1 
q{1,2} = 'sensor 1'; 
q{2,1}='D6000003ACA0AB28.txt';% sensor 2 
q{2,2} = 'sensor 2'; 
q{3,1}='B0000003AC9B8428.txt'; % sensor 3 
q{3,2} = 'sensor 3'; 
q{4,1}='5D000003AC5FEA28.txt';% sensor 4 
q{4,2} = 'sensor 4'; 
q{5,1}='E1000003AC5DA728.txt';% sensor 5 
q{5,2} = 'sensor 5'; 
q{6,1}='BE000003ACA4F828.txt';% sensor 6 
q{6,2} = 'sensor 6'; 
q{7,1}='5F000003AC8C6128.txt';% sensor 7 
q{7,2} = 'sensor 7'; 
q{8,1}='78000003AC77A328.txt'; 
q{8,2} = 'sensor 8'; % sensor 8 
q{9,1}='B2000003AC542A28.txt';% sensor 9 
q{9,2} = 'sensor 9'; 
q{10,1}='EB000003B717F328.txt';% sensor 10 
q{10,2} = 'sensor 10'; 
q{11,1}='86000003AC97AC28.txt';% sensor 11 
q{11,2} = 'sensor 11'; 
q{12,1}='78000003AC748828.txt';% sensor 12 
q{12,2} = 'sensor 12'; 
q{13,1}='A5000003AC905C28.txt';% sensor 20 
q{13,2} = 'sensor 20'; 
q{14,1}='B4000003ACA4A728.txt';% sensor 21 
q{14,2} = 'sensor 21'; 
q{15,1}='14000003AC69A528.txt';% sensor 22 
q{15,2} = 'sensor 22'; 
q{16,1}='99000003AC68F728.txt';% sensor 23 
q{16,2} = 'sensor 23'; 

for j=1:16 
fname=q{j}; 
fid=fopen(fname,'r'); 
header=fgetl(fid); 
data=textscan(fid,'%s','delimiter',';'); 
fclose(fid); 
data=data{:}; 
day=data(1:3:end); 
hour=data(2:3:end); 
temp=str2double(data(3:3:end)); 
time=cellfun(@(x) sprintf('%s %s',day{strcmpi(hour,x)},x),hour,'uniformoutput',0); 
% timev=datevec(time,'mm.dd.yyyy HH:MM:SS'); 
timen=datenum(time,'mm.dd.yyyy HH:MM:SS'); 
seconds=timen*86400/60; 
figure(1) 
subplot(5,4,j), 

h=plot(seconds-seconds(1),temp,'YDataSource','temp'); 
legend(h,q{j,2}); 

grid on 
xlabel('Time(mins)'); 
ylabel('Temp °C'); 

%subplot(1,1,i), 
figure(2) 
if(j==1) 
r=plot(seconds-seconds(1),temp); 
hold on 
set(r,'Color','blue','LineWidth',2) 
end 
if(j==2) 
    r=plot(seconds-seconds(1),temp); 

    set(r,'Color','green','LineWidth',2) 
end 
if(j==3) 
    r=plot(seconds-seconds(1),temp); 

    set(r,'Color','red','LineWidth',2) 

end 
if(j==4) 
    r=plot(seconds-seconds(1),temp); 

    set(r,'Color','cyan','LineWidth',2) 

end 

if(j==5) 
    r=plot(seconds-seconds(1),temp); 

    set(r,'Color','magenta','LineWidth',2) 

end 
if(j==6) 
    r=plot(seconds-seconds(1),temp); 

    set(r,'Color','yellow','LineWidth',2) 

end 
    if(j==7) 
    r=plot(seconds-seconds(1),temp); 

    set(r,'Color','black','LineWidth',2) 

    end 
    if(j==8) 
    r=plot(seconds-seconds(1),temp,'--'); 

    set(r,'Color','blue','LineWidth',2) 

    end 
    if(j==9) 
    r=plot(seconds-seconds(1),temp,'--'); 

    set(r,'color','green','LineWidth',2) 

    end 
    if(j==10) 
    r=plot(seconds-seconds(1),temp,'--'); 

    set(r,'Color','red','LineWidth',2) 

    end 
    if(j==11) 
    r=plot(seconds-seconds(1),temp,'--'); 
    set(r,'Color','cyan','LineWidth',2) 

    end 
    if(j==12) 
    r=plot(seconds-seconds(1),temp,'--'); 
    hold on 
    set(r,'Color','magenta','LineWidth',2) 

    end 
    if(j==13) 
    r=plot(seconds-seconds(1),temp,'--'); 

    set(r,'Color','yellow','LineWidth',2) 

    end 
    if(j==14) 
    r=plot(seconds-seconds(1),temp,'--'); 

    set(r,'Color','black','LineWidth',2) 

    end 
    if(j==15) 
    r=plot(seconds-seconds(1),temp,'-.'); 

    set(r,'Color','blue','LineWidth',2) 

    end 
    if(j==16) 
    r=plot(seconds-seconds(1),temp,'-.'); 
    set(r,'Color','green','LineWidth',2) 


    end 

legend('Sensor 1','Sensor 2','Sensor 3','Sensor 4','Sensor 5','Sensor 6',... 
    'Sensor 7','Sensor 8','Sensor 9','Sensor 10','Sensor 11','Sensor 12','Sensor 20','Sensor 21','Sensor 22','Sensor 23','Location','BestOutside') 


end 
pause(2*60) 
end end 
+0

類似的問題:[添加滾動條圖與subplots](http://stackoverflow.com/questions/5122716/add-scrollbar-to-figure-with-subplots) – Amro

回答

13

我不確定你指的是什麼樣的演示,但讓我解釋我將如何實現這樣的功能。

這個想法是在圖中創建一個大面板,它將包含所有的子圖。面板將比這個數字更大。您將不得不手動定位該面板內的軸。同樣使用滑塊,您將不得不保持面板本身的位置以控制它的哪一部分可見。

考慮下面的例子。我們將創建一個圖形,讓我們垂直滾動查看所有子圖。

我們開始創建一個人物,並把面板和滑塊組件來填滿整個圖:

%# create figure, panel, and slider 
w = 600; h = 500;   %# width/height of figure 
handles.hFig = figure('Menubar','figure', 'Resize','off', ... 
    'Units','pixels', 'Position',[200 200 w h]); 
handles.hPan = uipanel('Parent',handles.hFig, ... 
    'Units','pixels', 'Position',[0 0 w-20 h]); 
handles.hSld = uicontrol('Parent',handles.hFig, ... 
    'Style','slider', 'Enable','off', ... 
    'Units','pixels', 'Position',[w-20 0 20 h], ... 
    'Min',0-eps, 'Max',0, 'Value',0, ... 
    'Callback',{@onSlide,handles.hPan}); 

對於現在的滑塊被禁用。請注意,爲了保持簡單,我關閉了圖形大小調整。這樣我們可以將組件定位在固定的像素單元中。

接下來,我們將一次創建一個新的座標軸,使每個座標軸填充一個查看頁面。爲了便於使用,我將該代碼放在一個單獨的函數addAxis中。首先讓我來告訴我們如何調用該函數:

%# add and plot to axes one-by-one 
hAx = zeros(7,1); 
clr = lines(7); 
for i=1:7 
    hAx(i) = addAxis(handles); 
    plot(hAx(i), cumsum(rand(100,1)-0.5), 'LineWidth',2, 'Color',clr(i,:)) 
    title(hAx(i), sprintf('plot %d',i)) 
    pause(1) %# slow down so that we can see the updates 
end 

addAxis只是生長在大小容器面板,創建一個軸,它的頂部位置,調節滑塊限制,然後返回一個句柄到新創建的軸。

function hAx = addAxis(handles) 
    %# look for previous axes 
    ax = findobj(handles.hPan, 'type','axes'); 

    if isempty(ax) 
     %# create first axis 
     hAx = axes('Parent',handles.hPan, ... 
      'Units','normalized', 'Position',[0.13 0.11 0.775 0.815]); 
     set(hAx, 'Units','pixels'); 

    else 
     %# get height of figure 
     p = get(handles.hFig, 'Position'); 
     h = p(4); 

     %# increase panel height, and shift it to show new space 
     p = get(handles.hPan, 'Position'); 
     set(handles.hPan, 'Position',[p(1) p(2)-h p(3) p(4)+h]) 

     %# compute position of new axis: append on top (y-shifted) 
     p = get(ax, 'Position'); 
     if iscell(p), p = cell2mat(p); end 
     p = [p(1,1) max(p(:,2))+h p(1,3) p(1,4)]; 

     %# create the new axis 
     hAx = axes('Parent',handles.hPan, ... 
      'Units','pixels', 'Position',p); 

     %# adjust slider, and call its callback function 
     mx = get(handles.hSld, 'Max'); 
     set(handles.hSld, 'Max',mx+h, 'Min',0, 'Enable','on') 
     %#set(handles.hSld, 'Value',mx+h)  %# scroll to new space 
     hgfeval(get(handles.hSld,'Callback'), handles.hSld, []); 
    end 

    %# force GUI update 
    drawnow 
end 

滑塊回調函數簡單地移動所述面板上下根據滑塊的當前值:

function onSlide(hSld,ev,hPan) 
    %# slider value 
    offset = get(hSld,'Value'); 

    %# update panel position 
    p = get(hPan, 'Position'); %# panel current position 
    set(hPan, 'Position',[p(1) -offset p(3) p(4)]) 
end 

本實施例的結果是:

screenshot

+0

美好的... t帽子真的解決了我的問題..im查看此代碼,以便我可以修改我的依照 我必須繪製來自不同文本文件的數據,所以我把它們循環在for循環中。我使用了subplot命令,因爲我之前沒有空間,但現在通過添加滾動條另一個for循環添加到hax plot命令中。通過添加所有這些我的代碼只繪製(只是傳說)的第一個圖形,然後軸是相當隨意的,沒有圖形顯示。我打算自動縮放,並且不想限制xmin和xmax – mirage

+0

@Khalid:我不知道你現有的代碼是什麼,但是我認爲在使用這個代碼之後,你所要做的就是將調用替換爲'subplot'通過調用上述函數addAxis(當然有正確的參數) – Amro

+0

它創建兩個數字,一個用於多個地塊,一個用於子地塊。對於subplots我希望有滾動條,以便我可以將其滑下。我不知道如何調用這個函數,如果我將addaxis的調用替換爲我的函數,那麼如何在不調用addaxis函數的情況下重新調整軸。 多數民衆贊成這是如何我的功能看起來像 函數abc subplot(5,4,j), h = plot(秒 - 秒(1),溫度,'YDataSource','溫度'); legend(h,q {j,2}); (2) r = plot(seconds-seconds(1),temp); %同一圖上的多個圖 保留 – mirage