在GUI中的子图中添加滚动条

在GUI中的子图中添加滚动条

问题描述:

如何将滚动条添加到子图中?在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://*.com/questions/5122716/add-scrollbar-to-figure-with-subplots) – Amro

我不确定你指的是什么样的演示,但让我解释我将如何实现这样的功能。

这个想法是在图中创建一个大面板,它将包含所有的子图。面板将比这个数字更大。您将不得不手动定位该面板内的轴。同样使用滑块,您将不得不保持面板本身的位置以控制它的哪一部分可见。

考虑下面的例子。我们将创建一个图形,让我们垂直滚动查看所有子图。

我们开始创建一个人物,并把面板和滑块组件来填满整个图:

%# 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