Изменение размера осей при построении графика на одном рисунке

Пожалуйста, создайте две функции, чтобы иметь возможность воспроизвести то, что я имею в виду:

Первая функция:

function testPlot1()

pointData = rand(20000,3);
figure;
%hold on;  % <- if commented out, does not work
plot3(pointData(:,1), pointData(:,2), pointData(:,3),'Marker', '.', 'MarkerEdgeColor', 'b','MarkerSize', 5, 'LineStyle', 'none');

axis equal;
xh = xlabel('X');
yh = ylabel('Y');
zh = zlabel('Z');
set([xh,yh, zh],...
    'fontweight','bold',...
    'fontsize',14,...
    'color',[0,0,0]);
view(0,20);

end

Вторая функция:

function testPlot2(fighandle)
axes(fighandle);
hold on;
plot3([0 3],[0 3],[0 3], 'r', 'LineWidth', 10);
end

Если вы сейчас позвоните

testPlot1();testPlot2(gca)

вы получите следующее: введите здесь описание изображения

Однако если вы раскомментируете строку «hold on» в testPlot1() и снова вызовете приведенный выше оператор, вы получите:

введите здесь описание изображения

Для меня это непонятное поведение. В первом случае testPlot1() создает фигуру, рисует в ней облако точек и изменяет свойства осей. Затем вызов testPlot2(gca) добавляет линию к рисунку, но линия обрезается. Однако во втором случае линия больше не обрезается. Почему он сейчас не обрезается, а раньше был?

Кажется, это связано с изменениями, которые я делаю в свойствах осей в testPlot1(). Может ли кто-нибудь объяснить мне это поведение? (почему работает с задержкой, к чему приводят мои изменения в свойствах осей)


person user1809923    schedule 08.10.2014    source источник
comment
Это опечатка: (почему это работает с удержанием, ... Это не работает с hold on, не об этом ли вы спрашиваете?   -  person Unapiedra    schedule 08.10.2014
comment
Нет, не опечатка. Я все равно внесу правки, потому что это немного сбивает с толку. Первый раз, когда я вызываю testPlot1(); testPlot2(gca) , это когда закомментировано удержание. Я также попытаюсь немного прояснить мою путаницу.   -  person user1809923    schedule 08.10.2014


Ответы (1)


hold on — это команда Matlab (hold off снова ее отключает), с помощью которой вы можете рисовать несколько элементов на одной фигуре без стирания предыдущих элементов.

Что случается

Если вы вызываете функцию plot, создается фигура (или используется уже существующая фигура!), и Matlab рисует новый график на этой фигуре. Предыдущий сюжет, который был на этом рисунке, исчез.

Если вы хотите добавить больше точек на свой график, вы можете позвонить hold on, а затем снова позвонить plot, на этот раз с другими номерами и, возможно, другим цветом или около того. Однако, если вы забудете снова повернуть hold off для активной фигурки, все ваши действия по рисованию (например, plot) будут добавлены к фигурке. Это то, что происходит на вашем втором изображении в вашем вопросе. Вы нарисовали несколько точек в диапазоне от 0 до 1, а затем во второй функции добавили еще несколько, но в диапазоне от 2 до 3. В результате оси расширяются до диапазона от 0 до 3.

В качестве альтернативы вы можете вызвать figure, что приведет к появлению новой фигуры. figure_handle = figure(); вернет дескриптор фигуры, который вы можете передать своей функции, если у вас есть несколько фигур и вы хотите через некоторое время изменить одну из них.

person Unapiedra    schedule 08.10.2014
comment
Я знаю, но проблема выше заключается в изменении размера пределов осей. В первом случае оба нарисованы на одном и том же рисунке, линия просто не видна, потому что она обрезана. - person user1809923; 08.10.2014
comment
Что вы ожидаете увидеть с hold on в function1? Я бы не хотел, чтобы он был там, во-первых, но то, что он делает, совершенно ожидаемо. - person Unapiedra; 08.10.2014
comment
Если мой комментарий не имеет смысла, это потому, что пользователь1809923 изменил свой комментарий... - person Unapiedra; 08.10.2014