Matlab:当数据离开情节时指示情节?

时间:2016-02-06 17:11:23

标签: matlab plot

有没有办法在绘图轴上为Matlab中当前绘图的任何数据点添加标记?如果该方法适用于缩放和平移,那就太棒了,但我可以没有它。

我正在使用子图绘制几个数据集。每个图包含20个数据点,类似于飞镖落在飞镖板上的标记。对于大多数数据集,这些图都在标准范围内,即飞镖板的尺寸,因此我将此标准用于每个图的轴范围,以使子图在视觉上容易比较。但是,一些数据集的异常值超出了此标准范围(通常在外部)。我不想更改轴以显示异常值,但我希望用户知道图中有一个或多个数据点,最好是它们关闭的方向。

我想过尝试使用轴标记(set(gca, 'Ytick', xLowerLimit: markSpacing: xUpperLimit))并添加一个不同颜色的额外标记以指示异常值的位置,但我无法看到如何在不中断的情况下执行此操作常规标记和自动方式,可以允许多个异常值标记。

2 个答案:

答案 0 :(得分:4)

一种方法是查看是否有任何超出Y轴限制的数据,然后在某处放置一些文本以通知用户。选项包括text(将文本放在轴上)或uicontrol(将文本放在图窗口的某处)。

以下是使用uicontrol的示例:

% Set up figure window and axes
h.f = figure;
h.ax = axes('Units', 'Normalized', 'Position', [0.13 0.2 0.75 0.75]);

% Plot some sample data and window our axes to replicate the question
x = 1:10;
y = [1:9 20];

xmin = 0; xmax = 10;
ymin = 0; ymax = 10;
plot(h.ax, x, y);
axis(h.ax, [xmin xmax ymin ymax]);

% Generate logical matrix to find if any y data is beyond our axis limit
ymask = y > ymax;

if any(ymask) % Loop triggers if any y value is greater than ymax
    str = sprintf('There are %u data points greater than current y axis limit', sum(ymask));
    uicontrol('Parent', h.f, ...
              'Style', 'text', ...
              'Units', 'Normalized', ...
              'Position', [0.01 0.01 0.9 0.05], ...
              'String', str ...
              );
end

生成以下内容(手动添加注释):

yay

这可以通过一些简单的复制+粘贴和调整扩展到其他方向。

答案 1 :(得分:3)

编辑:请参阅底部,了解使用回调的改进方法。

您可以找到超过axes限制的数据点,并使用不同的符号在限制上绘制它们:

A = randn(20, 2);

x_range = [-1.5, 1.5];
y_range = [-1.5, 1.5];

figure(1);
clf;
ah = axes;
plot(ah, A(:,1), A(:,2), 'o')
hold on
set(ah, 'XLim', x_range, 'YLim', y_range)

x_lt = A(:,1) < x_range(1);
x_gt = A(:,1) > x_range(2);
y_lt = A(:,2) < y_range(1);
y_gt = A(:,2) > y_range(2);

A_out = A;
A_out(x_lt, 1) = x_range(1);
A_out(x_gt, 1) = x_range(2);
A_out(y_lt, 2) = y_range(1);
A_out(y_gt, 2) = y_range(2);
A_out = A_out(x_lt | x_gt | y_lt | y_gt, :);
plot(ah, A_out(:,1), A_out(:,2), 'rx')

这会产生如下情节:

Example plot with outliers

编辑:添加回调

如果你真的想要花哨,可以添加回调,以便在缩放图形时自动绘制(和删除)异常值。添加相同的平移功能留给读者练习;)

mark_outliers.m

function mark_outliers(fig, ax)
ah = ax.Axes;
lobj = findobj(ah, 'Type', 'Line');
x_range = ah.XLim;
y_range = ah.YLim;
ah.NextPlot = 'add';
for i_l = 1:numel(lobj)
    xd = lobj(i_l).XData;
    yd = lobj(i_l).YData;
    x_lt = xd < x_range(1);
    x_gt = xd > x_range(2);
    y_lt = yd < y_range(1);
    y_gt = yd > y_range(2);
    outliers = x_lt | x_gt | y_lt | y_gt;
    if any(outliers)
        xd_out = xd;
        xd_out(x_lt) = x_range(1);
        xd_out(x_gt) = x_range(2);
        yd_out = yd;
        yd_out(y_lt) = y_range(1);
        yd_out(y_gt) = y_range(2);
        xd_out = xd_out(outliers);
        yd_out = yd_out(outliers);

        plot(ah, xd_out, yd_out, 'xr', 'Tag', 'Outliers')
    end
end

delete_outliers.m

function delete_outliers(fig, ah)
    ah = ah.Axes;
    delete(findobj(ah, 'Tag', 'Outliers'));

example.m

A = randn(20, 2);

fh = figure(1);
clf;
ah = axes;
plot(ah, A(:,1), A(:,2), 'o')

h = zoom(fh);
h.ActionPreCallback=@delete_outliers;
h.ActionPostCallback=@mark_outliers;