2012-03-15 3 views
2

enter image description hereЕсть ли способ исправить этот конечный эффект построения в Matlab?

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] 

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

Я имею в виду прямые линии от конца, которые возвращаются к началу координат. Best, Abid

+0

Можете ли вы разместить образец данных, которые вы рисуете? Это должно быть первое и последнее значение 10 [t, x] '. –

+0

Каково значение x (end)? – tmpearce

+0

И какую команду 'plot' вы используете? – tmpearce

ответ

3

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

  1. Сортировать:

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

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

  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) 
+0

Это очень хорошие предложения, 1-й и 3-й из которых я пробовал и не работал для своих данных из-за того, что это временный ряд, а также потому, что он отбирается, так что неясно, когда рассеян. Я также не понимаю, что вы подразумеваете под своим вторым предложением. – Abid

+0

Для подхода 2, чтобы найти точки в вашем временном ряду, где время перескакивает назад, используйте 'find (diff (t) <0) 'и введите NaNs в этих местах – Max

Смежные вопросы