Есть ли способ исправить этот конечный эффект построения в Matlab? - PullRequest
2 голосов
/ 15 марта 2012

enter image description here

 WaterFraction=[0.705 0.047 -0.15 -0.046 0.18 -0.070 -0.089 -0.0815 -0.0731 -0.08 ...
                   -0.43 -0.537 -0.543 -0.62 -0.548 -0.55 -0.33 -0.112 0.10 0.0590 ]
Radius=[ -1.25 -0.811 -0.448 -0.320 -0.384  -0.0923 0.168   0.1039 0.039 0.276 ...
        -0.127 -0.137 -0.1088 -0.080 0.0220 0.049 2.34 4.58 6.84 -8.0]

Когда я строю вектор данных по его вектору времени, и, конечно, оба имеют одинаковый размер, это иногда случается, и это неприятно визуально.

Я имею в виду прямые линии от конца, которые возвращаются к началу координат. Лучший, Абид

1 Ответ

3 голосов
/ 15 марта 2012

У вас есть несколько вариантов, в зависимости от ваших обстоятельств.Вы можете либо отсортировать данные, чтобы избежать разрывов, либо вставить несколько NaN s в векторы X и Y.

  1. Для сортировки:

    [xSorted, ixsSort] = sort(x);
    ySorted = y(ixSort);
    plot(xSorted, ySorted);
    
  2. Чтобы добавить nans, вам нужно проделать дополнительную работу, чтобы определить, где должны быть разрывы, а затем вставить NaN.Например, чтобы разбить строку после 10-й записи

    xBroken = [x(1:10) nan x(11:end)];
    yBroken = [y(1:10) nan y(11:end)];
    plot(xBroken, yBroken);
    

    Редактировать: см. Пример кода ниже для более полного примера.

  3. Конечно, как легкорезервное копирование, просто сделайте точечный график вместо линейного графика:

    plot(x, y, '.');
    

Некоторые примеры кода для метода 2 ниже:

%Some sample data
x = [1:10 2.1:11 3.2:12];
y = randn(size(x));

%Define where breaks are needed (and associated boundaries)
ixsBreaksNeeded = find(diff(x)<0);
ixsSegmentBoundaries = [0 ixsBreaksNeeded length(x)];  %This makes the iterations a lot easier

%Predefine some nan vectors to move data into
xBroken = nan(1, length(x) + length(ixsBreaksNeeded));
yBroken = nan(1, length(x) + length(ixsBreaksNeeded));

%Move data segments into nan vectors, leaving gaps between segments
ixOffset = 0;
for ix = 2:length(ixsSegmentBoundaries)
    ixsOriginal = (ixsSegmentBoundaries(ix-1)+1):ixsSegmentBoundaries(ix);
    xBroken(ixsOriginal + (ixOffset)) = x(ixsOriginal);
    yBroken(ixsOriginal + (ixOffset)) = y(ixsOriginal);
    ixOffset = ixOffset+1;
end

%Plot to demonstrate
subplot(211)
plot(x,y);
subplot(212)
plot(xBroken, yBroken)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...