2014-12-08 3 views
1

Это продолжение с вопроса уже размещено here. Я использовал метод, предложенный Энди. Но, похоже, существует ограничение. команда set(handle, 'XData', x), похоже, работает до тех пор, пока x является вектором. что, если x - матрица?Как обновить данные графика в Matlab? part - 2

Позвольте мне объяснить на примере. Скажем, мы хотим нарисовать 3 прямоугольника, вершины которых заданы матрицами x_vals (матрица 5,3) и y_vals (матрица 5,3). Команда, которая будет использоваться для построения, - это просто plot(x,y).

Теперь мы хотим обновить приведенный выше график. На этот раз мы хотим нарисовать 4 прямоугольника. вершины которых находятся в матрицах x_new (матрица 5,4) и y_new (5,4 матрицы), которые мы получаем после некоторых расчетов. Теперь с помощью команды set(handle, 'XData', x, 'YData', y) после обновления x и y с новыми значений приводит к ошибке, которая гласит

Error using set Value must be a column or row vector

Любой способ решить эту проблему?

function [] = visualizeXYZ_struct_v3(super_struct, start_frame, end_frame) 

% create first instance 
no_objs = length(super_struct(1).result); 
x = zeros(1,3000); 
y = zeros(1,3000); 

box_x = zeros(5, no_objs); 
box_y = zeros(5, no_objs); 

fp = 1; 

% cascade values across structures in a frame so it can be plot at once; 
for i = 1:1:no_objs 

    XYZ = super_struct(1).result(i).point_xyz; 
    [r,~] = size(XYZ); 
    x(fp:fp+r-1) = XYZ(:,1); 
    y(fp:fp+r-1) = XYZ(:,2); 
    % z(fp:fp+r-1) = xyz):,3); 
    fp = fp + r; 

    c = super_struct(1).result(i).box; 
    box_x(:,i) = c(:,1); 
    box_y(:,i) = c(:,2); 

end 
x(fp:end) = []; 
y(fp:end) = []; 

fig = figure('position', [50 50 1280 720]); 
hScatter = scatter(x,y,1); 
hold all 
hPlot = plot(box_x,box_y,'r'); 
axis([-10000, 10000, -10000, 10000]) 
xlabel('X axis'); 
ylabel('Y axis'); 
hold off 
grid off 
title('Filtered Frame'); 


tic 
for num = start_frame:1:end_frame 
    no_objs = length(super_struct(num).result); 
    x = zeros(1,3000); 
    y = zeros(1,3000); 

    box_x = zeros(5, no_objs); 
    box_y = zeros(5, no_objs); 
    fp = 1; 

    % cascade values accross structures in a frame so it can be plot at once; 
    for i = 1:1:no_objs 

     XYZ = super_struct(num).result(i).point_xyz; 
     [r,~] = size(XYZ); 
     x(fp:fp+r-1) = XYZ(:,1); 
     y(fp:fp+r-1) = XYZ(:,2); 
     fp = fp + r; 

     c = super_struct(num).result(i).box; 
     box_x(:,i) = c(:,1); 
     box_y(:,i) = c(:,2); 

    end 

    x(fp:end) = []; 
    y(fp:end) = []; 

    set(hScatter, 'XData', x, 'YData', y); 
    set(hPlot, 'XData', box_x, 'YData', box_y); % This is where the error occurs 

end 

toc 

end 
+1

@ Andrey Просто хотел узнать, был ли вопрос ясен и имеет смысл – bvk

ответ

1

Каждая линия на графике имеет свои собственные XData и YData свойств, и каждый из них может быть установлен в вектор индивидуален. См. the reference. Я не на консоли Matlab прямо сейчас, но, насколько я помню,

kidnum = 1 
h_axis = gca  % current axis - lines are children of the axis 
kids = get(h_axis,'Children') 
for kid = kids 
    kid_type = get(kid,'type') 
    if kid_type == 'line' 
     set(kid,'XData',x_new(:,kidnum)) 
     set(kid,'YData',y_new(:,kidnum)) 
     kidnum = kidnum+1 
    end 
end 

Надеюсь, что это поможет! См. Также overall reference графическим объектам и свойствам.

Чтобы добавить серию, скажем

hold on % so each "plot" won't touch the lines that are already there 
plot(x_new(:,end), y_new(:,end)) % or whatever parameters you want to plot 

После этого, новая серия будет ребенок h_axis и могут быть изменены.

+0

мой первый взгляд на код говорит мне, что вы изменяете существующие строки. Но для меня размер 'x_new' и' y_new' будет меняться каждый раз, когда я запускаю цикл for. Другими словами, количество строк, которые я хочу сделать, не является постоянным. Как добавить новые строки или удалить существующие строки из графика? исправьте меня, если я где-то ошибаюсь. – bvk

+0

@bvk - отредактирован ответ для указания. Опять же, делая это из памяти, так YMMV :) – cxw

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