91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

matlab中如何保持每個子圖的大小并加滾動條來上下滾動查看各個子圖

發布時間:2021-12-21 10:43:11 來源:億速云 閱讀:691 作者:柒染 欄目:大數據

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: 子圖的列數
%%
clc
close all

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

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

% 創建一個Panel用于放 子坐標 的Panel
Panel = uipanel('Parent', HBox);

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

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

% 計算一下子坐標的寬度,實際上不用算(因為放到布局里面了),
% 這里算是為了大概算一下 子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的最小值為0
Slider.Min = 0;
% 設置Slider的當前值為Slider的最大值(把slider拿到上方去)
Slider.Value = Slider.Max;
% 初始化 上一次點擊slider時slider的值 Slider_PreviousValue 為slider的最大值
setappdata(fMain, 'Slider_PreviousValue', Slider.Max)

% 創建 子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)

% 創建網格布局
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);

end


function 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應該向上動

% 獲取放坐標系的Panel
Panel_Sub = getappdata(fMain, 'Panel_Sub');
% 計算要移動的高度

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

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

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

其實也挺簡單的;要再優化一下可能就麻煩了一點。

結果:

matlab中如何保持每個子圖的大小并加滾動條來上下滾動查看各個子圖

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红安县| 阿拉善盟| 修武县| 顺昌县| 桓仁| 盐池县| 洛浦县| 四川省| 泰来县| 桃园县| 吉首市| 平陆县| 自治县| 永定县| 岳普湖县| 会昌县| 顺义区| 北碚区| 维西| 富锦市| 博罗县| 甘洛县| 花莲县| 逊克县| 屏南县| 资兴市| 邛崃市| 仙桃市| 资中县| 天峨县| 华容县| 浠水县| 肥西县| 阿荣旗| 镇原县| 澎湖县| 大竹县| 宁陵县| 温州市| 平泉县| 九龙县|