matlab中如何保持每個(gè)子圖的大小并加滾動(dòng)條來上下滾動(dòng)查看各個(gè)子圖

matlab中如何保持每個(gè)子圖的大小并加滾動(dòng)條來上下滾動(dòng)查看各個(gè)子圖,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)為客戶提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁設(shè)計(jì)、網(wǎng)站程序開發(fā)、WEB系統(tǒng)開發(fā)、微信二次開發(fā)、手機(jī)網(wǎng)站制作設(shè)計(jì)等網(wǎng)站方面業(yè)務(wù)。

matlab中如何保持每個(gè)子圖的大小并加滾動(dòng)條來上下滾動(dòng)查看各個(gè)子圖

思路

只考慮窗口內(nèi)放不下這一系列子坐標(biāo)系的情況

首先要知道在matlab的figure中控件的Position屬性值中的前兩個(gè)元素支持負(fù)數(shù)!

可以這樣去理解,matlab的figure或是Panel或是其他的,其坐標(biāo)系統(tǒng)都是以左下角的點(diǎn)為坐標(biāo)原點(diǎn)。在figure或是Panel的范圍內(nèi)都屬于“第一象限”,我還是畫一個(gè)圖吧.......

matlab中如何保持每個(gè)子圖的大小并加滾動(dòng)條來上下滾動(dòng)查看各個(gè)子圖

所以,我們可以用一個(gè)Panel來盛放這一些列子坐標(biāo)系,把這個(gè)Panel設(shè)置為定寬,由于高度肯定是比窗口的高度要高了,所以可以設(shè)置這個(gè)Panel的縱坐標(biāo)為負(fù)值(橫坐標(biāo)就設(shè)置為0,寬度與窗口等寬)。這個(gè)縱坐標(biāo)具體值為:Panel的高度減去窗口的高度得出來的差值取相反數(shù)。

怎樣滾動(dòng)呢?可以直接用Slider控件(嫌丑的話自己做一個(gè)Slider,這里Slider是豎直的,slider在最上面時(shí)才是最大值狀態(tài)),把其最大值設(shè)置為上面算出來的那個(gè)差值的絕對(duì)值,最小值就設(shè)置為0。然后去寫Slider的callback,每點(diǎn)擊一次就獲取上一次點(diǎn)擊時(shí)Slider的Value值,然后與當(dāng)前Slider的Value值做差;如果算出來的這個(gè)差值為負(fù),說明slider在向下滑動(dòng),因此對(duì)應(yīng)的Panel是向上移動(dòng)的,所以直接用Panel的縱坐標(biāo)減去這個(gè)差值(減負(fù)數(shù)就是在加正數(shù));差值為正則是相反的情況,同理。

但是,我在做的時(shí)候沒有用subplot畫子圖,我用的之前講過的Grid布局來布局若干個(gè)由axes生成的坐標(biāo)系,然后在這些坐標(biāo)系上畫圖。因?yàn)槲矣X得這樣做出來的比subplot做出來的看著要舒服點(diǎn)。不過你非要用subplot來整也基本差不多。

還有,如果把Panel或者其他控件放入布局中,你是沒法改它的Position值(其實(shí)是改了也沒用),而我想讓這個(gè)和Slider構(gòu)成一個(gè)水平布局。所以我這里用了2個(gè)Panel,一個(gè)Panel(父Panel)用來和Slider進(jìn)行水平布局,而其 子Panel才放那的些個(gè)Axes。

由于時(shí)間原因,這代碼只是用來說明這個(gè)思路可行,沒有做優(yōu)化,有興趣的大哥大姐可以自己優(yōu)化一下并定制成一個(gè)函數(shù),以后就用這個(gè)來當(dāng)subplot用。

比如:

1. 加一個(gè)判斷,如果一個(gè)窗口能裝下那些子坐標(biāo)系,就不用顯示Slider。

2. 不使用Slider而使用鼠標(biāo)上下拖動(dòng)的方式來移動(dòng)Panel,等等。

另外,這思路不僅可用在這地方,如果你一個(gè)界面裝不下那么多控件就可以用本文說的思路,但是不僅以用Slider來上下滑動(dòng),可以采用用鼠標(biāo)拖拽界面的方式來實(shí)現(xiàn)。

代碼

function Multi_Subplot_Scroll(row, column)
% row: 子圖的行數(shù)
% column: 子圖的列數(shù)
%%
clc
close all

fMain  = figure('NumberTitle', 'off', ...
    'Menubar', 'none', ...
    'Units', 'pixels', ...
    'Position', [500, 100, 1000, 500], ...
    'Resize', 'off');

%%
% 創(chuàng)建一個(gè)水平布局
HBox = uiextras.HBox('Parent', fMain);

% 創(chuàng)建一個(gè)Panel用于放 子坐標(biāo) 的Panel
Panel = uipanel('Parent', HBox);

% 創(chuàng)建一個(gè)slider用于滾動(dòng)subplot
Slider = uicontrol('Style', 'slider', ...
    'Parent', HBox, ...
    'callback', {@callback_Slider, fMain});

% Slider寬20pix,剩下的寬度都給Panel
HBox.Widths = [-1, 20];

% 計(jì)算一下子坐標(biāo)的寬度,實(shí)際上不用算(因?yàn)榉诺讲季掷锩媪耍?br/>% 這里算是為了大概算一下 子Panel的高度,
width_axes = fix( Panel.Position(3) / column ); % hight_axes = width_axes;

% 計(jì)算 子Panel的高度
Panel_Sub_Height = width_axes * row;

%% 這里不考慮行數(shù)很少,以至于一個(gè)窗口就能放下的情況(也就是只考慮放坐標(biāo)的子Panel比其父Panel高)
% 計(jì)算高度差
diff_Height = Panel_Sub_Height - Panel.Position(4);

% 設(shè)置Slider的最大值為高度差
Slider.Max = diff_Height;
% 設(shè)置Slider的最小值為0
Slider.Min = 0;
% 設(shè)置Slider的當(dāng)前值為Slider的最大值(把slider拿到上方去)
Slider.Value = Slider.Max;
% 初始化 上一次點(diǎn)擊slider時(shí)slider的值 Slider_PreviousValue 為slider的最大值
setappdata(fMain, 'Slider_PreviousValue', Slider.Max)

% 創(chuàng)建 子Panel
Panel_Sub = uipanel('Parent', Panel, ...
    'Units', 'pixels', ...
    'Position', [0, -diff_Height, Panel.Position(3), Panel_Sub_Height], ...
    'BackgroundColor', 'k');
% 保存 子Panel
setappdata(fMain, 'Panel_Sub', Panel_Sub)

% 創(chuàng)建網(wǎng)格布局
Grid_axes = uiextras.Grid('Parent', Panel_Sub);

% 畫各個(gè)子圖
for i = 1 : row * column
    ax = axes('Parent', Grid_axes);
    fplot(@sin)

end

% 設(shè)置網(wǎng)格布局的參數(shù)
Grid_axes.Heights = -ones(1, row);
Grid_axes.Widths = -ones(1, column);

end


function callback_Slider(self, ~, fMain)
% 獲取Slider的上一次值
Slider_PreviousValue = getappdata(fMain, 'Slider_PreviousValue');
% 獲取當(dāng)前Slider的值
current_SliderValue = self.Value;

% 計(jì)算兩者差值
diff_SliderValue = current_SliderValue - Slider_PreviousValue;
% 如果為負(fù)說明Slider向下滑,Panel_Sub應(yīng)該向上動(dòng)

% 獲取放坐標(biāo)系的Panel
Panel_Sub = getappdata(fMain, 'Panel_Sub');
% 計(jì)算要移動(dòng)的高度

% 重置Panel_Sub的Position
Panel_Sub.Position(2) = Panel_Sub.Position(2) - diff_SliderValue;

% 保存當(dāng)前Slider的Value
setappdata(fMain, 'Slider_PreviousValue', current_SliderValue)
end

(這兩個(gè)function在同一個(gè)文件夾下)

其實(shí)也挺簡(jiǎn)單的;要再優(yōu)化一下可能就麻煩了一點(diǎn)。

結(jié)果:

matlab中如何保持每個(gè)子圖的大小并加滾動(dòng)條來上下滾動(dòng)查看各個(gè)子圖

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

網(wǎng)站題目:matlab中如何保持每個(gè)子圖的大小并加滾動(dòng)條來上下滾動(dòng)查看各個(gè)子圖
地址分享:http://muchs.cn/article0/jcheoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)網(wǎng)站制作、自適應(yīng)網(wǎng)站域名注冊(cè)、外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)