Matlab GUI选择要绘制的轴

时间:2016-03-30 13:20:15

标签: matlab user-interface matlab-figure

我使用下面的代码绘制串口数据。由于我有两个绘图轴,如何为该绘图选择特定的轴? 从类似的问题,我发现他们使用轴(handles.axes2);.由于我在程序开始时声明了绘图,我应该在哪里放置这行代码?我在指定剧情标题等之前尝试放置它但是它没有用。

% Serial Data Logger
% Yu Hin Hau
% 7/9/2013
% **CLOSE PLOT TO END SESSION

clear
clc

%User Defined Properties 
serialPort = 'COM5';            % define COM port #
plotTitle = 'Serial Data Log';  % plot title
xLabel = 'Elapsed Time (s)';    % x-axis label
yLabel = 'Data';                % y-axis label
plotGrid = 'on';                % 'off' to turn off grid
min = -1.5;                     % set y-min
max = 1.5;                      % set y-max
scrollWidth = 10;               % display period in plot, plot entire data log if <= 0
delay = .01;                    % make sure sample faster than resolution

%Define Function Variables
time = 0;
data = 0;
count = 0;

%Set up Plot
plotGraph = plot(time,data,'-mo',...
                'LineWidth',1,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor',[.49 1 .63],...
                'MarkerSize',2);

title(plotTitle,'FontSize',25);
xlabel(xLabel,'FontSize',15);
ylabel(yLabel,'FontSize',15);
axis([0 10 min max]);
grid(plotGrid);

%Open Serial COM Port
s = serial(serialPort)
disp('Close Plot to End Session');
fopen(s);

tic

while ishandle(plotGraph) %Loop when Plot is Active

    dat = fscanf(s,'%f'); %Read Data from Serial as Float

    if(~isempty(dat) && isfloat(dat)) %Make sure Data Type is Correct        
        count = count + 1;    
        time(count) = toc;    %Extract Elapsed Time
        data(count) = dat(1); %Extract 1st Data Element         

        %Set Axis according to Scroll Width
        if(scrollWidth > 0)
        set(plotGraph,'XData',time(time > time(count)-scrollWidth),'YData',data(time > time(count)-scrollWidth));
        axis([time(count)-scrollWidth time(count) min max]);
        else
        set(plotGraph,'XData',time,'YData',data);
        axis([0 time(count) min max]);
        end

        %Allow MATLAB to Update Plot
        pause(delay);
    end
end

%Close Serial COM Port and Delete useless Variables
fclose(s);
clear count dat delay max min plotGraph plotGrid plotTitle s ...
        scrollWidth serialPort xLabel yLabel;


disp('Session Terminated...');

1 个答案:

答案 0 :(得分:4)

获得可靠的绘图和操作的技巧是在创建plot或任何其他图形对象时始终使用Parent parameter明确指定父。所有图形对象都支持此参数。

hax = axes();
plot(x,y, 'Parent', hax);

@matlabgui建议的另一种选择是将父轴指定为plot的第一个输入:

plot(hax, x, y);

我个人更喜欢使用Parent参数作为参数值对,因为该行为在所有图形对象中是一致的。

使用在轴上操作的其他功能时,还应指定轴手柄。

xlabel(hax, 'XLabel')
ylabel(hax, 'YLabel')
title(hax, 'This is a title')
axis(hax, [0 0 1 1])
grid(hax, 'on')
hold(hax, 'on')

如果您正在处理交互式GUI,这一点尤为重要,因为用户可以在绘图过程中轻松点击不同的轴,导致gca的值意外更改。同时更改当前轴(使用axes(hax))可能会导致糟糕的用户体验。

摘要

对于您的特定代码,这将涉及更改您的初始plot电话:

plotGraph = plot(time,data,'-mo',...
                 'LineWidth',1,...
                 'MarkerEdgeColor','k',...
                 'MarkerFaceColor',[.49 1 .63],...
                 'MarkerSize',2, ...
                 'Parent', handles.axes2);

我还建议为您的调用添加显式轴句柄:gridtitleaxisxlabelylabel,以确保他们的target是你想要的轴。