Как вставить в графическое окно (plot) элементы управления

Больше
07 апр 2024 05:16 - 07 апр 2024 05:31 #154 от roman
Давайте рассмотрим конкретную задачу:
у меня есть два графика subplot на одном окне и мне нужно менять масштаб по оси Х сразу у двух графиков
Обычными средствами Matlab я это сделать не могу, так как масштаб меняется в графиках независимо друг от друга.

Первоначально создадим графическое окно для вывода графиков
Code:
f=figure (); sub1=subplot(2, 1, 1); hold on grid on sub2=subplot(2, 1, 2); hold on grid on


Таким, образом у нас появились две переменные (sub1 и sub2) которые будут использоваться для добавления графиков (plot)

1. Чтобы добавить график в переменную (sub1 и sub2) используется следующий синтаксис
Code:
plot(sub1,data_1); plot(sub2,data_2);

где data_1 и data_2 - данные для построения графика

2. Чтобы задать пределы для отображения графика в переменных (sub1 и sub2) используется следующий синтаксис
Code:
xlim(sub1,[x_min x_max]) xlim(sub2,[x_min x_max])

где x_min и x_max - это значение диапазона, который будет выводится пользователю. Т.е. меняя диапазон для двух подграфиков (sub1 и sub2)  в одинаковых пределах, можно одновременно менять масштаб по оси Х у двух графиков. 
Таким образом поставленная задача будет решаться именно данной встроенной функцией xlim.

3.Так же есть функция для удаления данных из окна подграфиков (sub1 и sub2). Данная функция может понадобится когда вы перестраиваете график с какими то новыми условиями.
Code:
cla(sub1) cla(sub2)

Как вы видите очистить окно подграфиков (sub1 и sub2) можно независимо друг от друга.

 
Последнее редактирование: 07 апр 2024 05:31 пользователем roman.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
07 апр 2024 05:42 - 07 апр 2024 05:53 #155 от roman
Рассмотрим теперь вопрос, добавления средств управления на графическое окно
Для этого сначала добавляется uipanel в определенную позицию 'Position', а затем в uipanel добавляются средства управления, например, два элемента slider для изменения x_min и x_max (изменение масштаба отображения графика по оси Х)

Ранее мы с Вами задали графическое окно 
Code:
f=figure();

Теперь в переменную f нужно добавить uipanel и  средства управления
Code:
p = uipanel(f,'Position',[0.1 0.48 0.8 0.05]); slider1 = uicontrol('Parent',p,'Units','Normalized','Position',[0.01 0.05 0.2 0.9],... 'Style','slider','SliderStep',[0.01,0.01],... 'Min',1,'Max',100,'Value',1,... 'Callback',{@(src,event) slider_Callback()}); slider2 = uicontrol('Parent',p,'Units','Normalized','Position',[0.8 0.05 0.2 0.9],... 'Style','slider','SliderStep',[0.01,0.01],... 'Min',1,'Max',100,'Value',100,... 'Callback',{@(src,event) slider_Callback()});


Соответственно при нажатии на Slider у нас будет вызываться функция slider_Callback(), которая в зависимости от ползунков slider1 и slider2 будет определять x_min и x_max и менять масштаб двух графиков:


Code:
xlim(sub1,[x_min x_max]) xlim(sub2,[x_min x_max])


Отдельно останавливаться на параметрах настройки uipanel и uicontrol - не будем.
Хотя они имеют определенные тонкости, так например, у slider есть параметр "SliderStep", который имеет два параметра настройки:
- первый параметр - задает минимальный шаг, который задается для двух стрелок (при нажатии стрелки влево или стрелки вправо)
-  второй параметр - задает минимальный шаг для ползунка (при нажатии на пространство между ползунком и стрелками)
Последнее редактирование: 07 апр 2024 05:53 пользователем roman.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
07 апр 2024 06:39 #156 от roman
Функция вызова slider_Callback() сформируем следующим образом:
Code:
function slider_Callback() global slider1 global slider2 global xmax global sub1 global sub2 ii_xstart=round(get(slider1,'value')/100*xmax); ii_xend=round(get(slider2,'value')/100*xmax); xlim(sub1,[ii_xstart ii_xend]) xlim(sub2,[ii_xstart ii_xend]) end

Давайте рассмотрим принцип работы функции.
1. Чтобы определить позицию ползунка в slider используется следующая конструкция:
Code:
get(slider1,'value')

Но нам вернут значение от 1 до 100, а нам нужно данное значение перевести в нумерации точки из базы данных построения рисунка data_1 и data_2. Кроме всего прочего это целое число, поэтому формула превращается в следующий вид:
Code:
ii_xstart=round([b][color=#2980b9]get(slider1,'value')[/color][/b]/100*xmax);

где функция round() - округление до целого значения, а переменная xmax - количество точек в диапазоне базы данных построения рисунка data_1 и data_2.
Примечание: база данных  data_1 и data_2 имеет одинаковое количество точек.

2. После определения начальной и конечной точки отображения по оси Х перестраиваем график функции
Code:
​​​​​​​xlim(sub1,[ii_xstart ii_xend]) xlim(sub2,[ii_xstart ii_xend])

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
07 апр 2024 06:44 #157 от roman
Таким образом, можно получить систему управления графиками в разных окнах.
1. Весь график
 
2. Отображение только последних данных
 
3. Отображение данных в каком-то диапазоне
 
 

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Работает на Kunena форум
Статистика сайта:
Яндекс.Метрика