在GUI的子图中添加滚动条 [英] Adding scroll bar in subplots within GUI

查看:65
本文介绍了在GUI的子图中添加滚动条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何将滚动条添加到子图中?

How can I add scrollbar to the subplots?

我已经看过很多教程,但是它们似乎很难理解(例如:

I have gone through many tutorials but they seem quite difficult to understand (ex: Scrolling Figure Demo)

有没有更容易实现的方法?

Any easier method to implement?

我的代码如下所示.它创建两个图形,一个用于多个图,一个用于子图.对于子图,我希望有滚动条,以便我可以将其向下滑动. 我不知道如何调用此函数,如果我将addaxis的调用替换为我的函数,那么如何在不调用addaxis函数的情况下重新调整轴.

My code looks like the following. It creates two figures ,one for multiple plots and one for subplots. For the case of subplots i wanted to have scroll bar so as i can slide it down. I dont know how to call this function, if i replace the call of addaxis to my function then how would the axis be readjusted without any call to addaxis function.

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

推荐答案

我不确定您要指的是什么演示,但让我解释一下如何实现这种功能.

I'm not sure what demo you are referring to, but let me explain how I would implement such a functionality.

这个想法是在图形中创建一个大面板,其中将包含所有子图.面板的尺寸将大于该图的尺寸.您将必须手动将轴定位在此面板内.此外,还必须使用滑块来保持面板本身的位置,以控制面板的哪一部分可见.

The idea is to create a large panel inside a figure, which will contain all the subplots. The panel would be larger than the figure in size. You will have to manually position the axes inside this panel. Also using a slider, you will have to maintain the position of the panel itself to control which part of it is visible.

请考虑以下示例.我们将创建一个图形,以便我们垂直滚动以查看所有子图.

Consider the following example. We will create a figure such that we scroll vertically to see all the subplots.

我们首先创建一个图形,然后放置一个面板和一个滑块组件以填充整个图形:

We start by creating a figure, and placing a panel and a slider components to fill the entire figure:

%# 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});

目前,滑块已禁用.请注意,为了简化操作,我关闭了图形大小调整功能.这样,我们就可以将组件定位在固定的像素单元中.

For now the slider is disabled. Note that in order to keep things simple, I turned off figure resizing. That way we can position components in fixed pixel units.

接下来,我们将一次创建一个新轴,使每个轴填充一个视图页面.我将该代码放在单独的函数addAxis中,以方便使用.首先,让我展示一下我们如何调用此函数:

Next, we will create new axes one at a time, making each fill one view page. I placed that code inside a separate function addAxis for easy use. First let me show how we call this function:

%# 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只是简单地增加了容器面板的大小,创建了一个轴,将其放置在顶部,调整滑块限制,然后将手柄返回到新创建的轴.

The addAxis simply grows the container panel in size, creates an axis, position it on the top, adjusts the slider limits, then returns a handle to the newly created axis.

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

滑块回调函数只是根据滑块的当前值上下移动面板:

The slider callback function simply shifts the panel up and down according to the current value of the slider:

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

此示例的结果:

这篇关于在GUI的子图中添加滚动条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆