温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

matlab中如何保持每个子图的大小并加滚动条来上下滚动查看各个子图

发布时间:2021-12-21 10:43:11 阅读:714 作者:柒染 栏目:大数据
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

matlab中如何保持每个子图的大小并加滚动条来上下滚动查看各个子图,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

matlab中如何保持每个子图的大小并加滚动条来上下滚动查看各个子图

思路

只考虑窗口内放不下这一系列子坐标系的情况

首先要知道在matlab的figure中控件的Position属性值中的前两个元素支持负数!

可以这样去理解,matlab的figure或是Panel或是其他的,其坐标系统都是以左下角的点为坐标原点。在figure或是Panel的范围内都属于“第一象限”,我还是画一个图吧.......

matlab中如何保持每个子图的大小并加滚动条来上下滚动查看各个子图

所以,我们可以用一个Panel来盛放这一些列子坐标系,把这个Panel设置为定宽,由于高度肯定是比窗口的高度要高了,所以可以设置这个Panel的纵坐标为负值(横坐标就设置为0,宽度与窗口等宽)。这个纵坐标具体值为:Panel的高度减去窗口的高度得出来的差值取相反数。

怎样滚动呢?可以直接用Slider控件(嫌丑的话自己做一个Slider,这里Slider是竖直的,slider在最上面时才是最大值状态),把其最大值设置为上面算出来的那个差值的绝对值,最小值就设置为0。然后去写Slider的callback,每点击一次就获取上一次点击时Slider的Value值,然后与当前Slider的Value值做差;如果算出来的这个差值为负,说明slider在向下滑动,因此对应的Panel是向上移动的,所以直接用Panel的纵坐标减去这个差值(减负数就是在加正数);差值为正则是相反的情况,同理。

但是,我在做的时候没有用subplot画子图,我用的之前讲过的Grid布局来布局若干个由axes生成的坐标系,然后在这些坐标系上画图。因为我觉得这样做出来的比subplot做出来的看着要舒服点。不过你非要用subplot来整也基本差不多。

还有,如果把Panel或者其他控件放入布局中,你是没法改它的Position值(其实是改了也没用),而我想让这个和Slider构成一个水平布局。所以我这里用了2个Panel,一个Panel(父Panel)用来和Slider进行水平布局,而其 子Panel才放那的些个Axes。

由于时间原因,这代码只是用来说明这个思路可行,没有做优化,有兴趣的大哥大姐可以自己优化一下并定制成一个函数,以后就用这个来当subplot用。

比如:

1. 加一个判断,如果一个窗口能装下那些子坐标系,就不用显示Slider。

2. 不使用Slider而使用鼠标上下拖动的方式来移动Panel,等等。

另外,这思路不仅可用在这地方,如果你一个界面装不下那么多控件就可以用本文说的思路,但是不仅以用Slider来上下滑动,可以采用用鼠标拖拽界面的方式来实现。

代码

function Multi_Subplot_Scroll(row, column)% row: 子图的行数% column: 子图的列数%%clcclose allfMain  = figure('NumberTitle''off', ...    'Menubar''none', ...    'Units''pixels', ...    'Position', [5001001000500], ...    'Resize''off');%%% 创建一个水平布局HBox = uiextras.HBox('Parent', fMain);% 创建一个Panel用于放 子坐标 的PanelPanel = uipanel('Parent', HBox);% 创建一个slider用于滚动subplotSlider = uicontrol('Style''slider', ...    'Parent', HBox, ...    'callback', {@callback_Slider, fMain});% Slider宽20pix,剩下的宽度都给PanelHBox.Widths = [-120];% 计算一下子坐标的宽度,实际上不用算(因为放到布局里面了),% 这里算是为了大概算一下 子Panel的高度,width_axes = fix( Panel.Position(3) / column ); % hight_axes = width_axes;% 计算 子Panel的高度Panel_Sub_Height = width_axes * row;%% 这里不考虑行数很少,以至于一个窗口就能放下的情况(也就是只考虑放坐标的子Panel比其父Panel高)% 计算高度差diff_Height = Panel_Sub_Height - Panel.Position(4);% 设置Slider的最大值为高度差Slider.Max = diff_Height;% 设置Slider的最小值为0Slider.Min = 0;% 设置Slider的当前值为Slider的最大值(把slider拿到上方去)Slider.Value = Slider.Max;% 初始化 上一次点击slider时slider的值 Slider_PreviousValue 为slider的最大值setappdata(fMain, 'Slider_PreviousValue', Slider.Max)% 创建 子PanelPanel_Sub = uipanel('Parent', Panel, ...    'Units''pixels', ...    'Position', [0, -diff_Height, Panel.Position(3), Panel_Sub_Height], ...    'BackgroundColor''k');% 保存 子Panelsetappdata(fMain, 'Panel_Sub', Panel_Sub)% 创建网格布局Grid_axes = uiextras.Grid('Parent', Panel_Sub);% 画各个子图for i = 1 : row * column    ax = axes('Parent', Grid_axes);    fplot(@sin)end% 设置网格布局的参数Grid_axes.Heights = -ones(1, row);Grid_axes.Widths = -ones(1, column);endfunction callback_Slider(self, ~, fMain)% 获取Slider的上一次值Slider_PreviousValue = getappdata(fMain, 'Slider_PreviousValue');% 获取当前Slider的值current_SliderValue = self.Value;% 计算两者差值diff_SliderValue = current_SliderValue - Slider_PreviousValue;% 如果为负说明Slider向下滑,Panel_Sub应该向上动% 获取放坐标系的PanelPanel_Sub = getappdata(fMain, 'Panel_Sub');% 计算要移动的高度% 重置Panel_Sub的PositionPanel_Sub.Position(2) = Panel_Sub.Position(2) - diff_SliderValue;% 保存当前Slider的Valuesetappdata(fMain, 'Slider_PreviousValue', current_SliderValue)end

(这两个function在同一个文件夹下)

其实也挺简单的;要再优化一下可能就麻烦了一点。

结果:

matlab中如何保持每个子图的大小并加滚动条来上下滚动查看各个子图

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/MitchHong/blog/4503062

AI

开发者交流群×