Matlab绘图:如何移除不连通区域之间的连接线?

4
假设您有1000个已索引的数据点,其中两个标签分为region1和region2。以下是如何生成这种随机数据的示例。
indices = 1:1000;
data = zeros(size(indices));

% some regions of data
region1 = [50:100 200:340 450:500 670:980];
region2 = setdiff(indices, region1);

% generating random data
data(region1) = rand(size(region1)) + 1;
data(region2) = rand(size(region2));

现在,如果我绘制这两个区域,我得到如下所示的图形: enter image description here 生成此图形的代码为:
% plotting
figure(1);
cla(gca);
hold on;
plot(region1, data(region1));
plot(region2, data(region2));
hold off;

现在的问题是:是否有一种优雅的方法可以在不进行大量数据操作的情况下删除不连续数据区域之间的连接线?我仍然想使用实线样式,或者拥有类似于实线样式的外观。
2个回答

3

如果你将x或y的值设置为NaN,那么它们将不会被绘制出来。由于你有两个互补的区域,你可以使用它们将值设置为NaN...

% Two vectors which each cover ALL elements in "data", but with NaN where
% the other region is to be plotted. As per example, indices=1:1000;
r1 = 1:1000; r1(region2) = NaN;
r2 = 1:1000; r2(region1) = NaN;
% Plot all data for both lines, but NaNs wont show.
figure(1); clf;
hold on;
plot(r1, data);
plot(r2, data);
hold off;

Output:

output


太好了,这正是我在寻找的。 - Vahe Tshitoyan

0
原来,如果您将区域表示为与xy长度相同的向量,并使用表示区域索引的整数值(例如,regions = [1 1 1 2 2 1 1 1 ..]),则有一种优雅的单行代码可以处理任意数量的区域。以下是一个示例。
% Generating test data
x = 1:1000;
y = sin(x/100) + rand(1, 1000);
regions = repelem([1 2 3 1 2 3 1 2 3 3], repelem(100, 10)); % a [1 x 1000] vector

% Plotting
plot(bsxfun(@rdivide, x(:), bsxfun(@eq, regions(:), unique(regions(:))')), y(:));

在这里,我正在使用值为Inf的矩阵构建x,因为由于@rdivide除以0而不应绘制这些值。结果如下所示。

Region Plotting Example

我希望这对未来的某个人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接