Построить несколько двухмерных контурных графиков на одной трехмерной фигуре [Matlab]

Я хотел бы знать, как построить несколько двухмерных контурных графиков, разнесенных по оси z, на трехмерную фигуру следующим образом:

вздор

1 ответ

Решение

ПРИМЕЧАНИЕ. Первая часть этого ответа предназначалась для графики HG1. Смотрите вторую часть, если вы работаете с MATLAB R2014b и выше ( HG2).


HG1:

contour Функция внутренне создает ряд patch объекты и возвращает их как объединенный объект hggroup. Таким образом, мы могли бы установить ZData всех патчей путем смещения Z-размеров до желаемого уровня (по умолчанию контур отображается при z=0).

Вот пример:

[X,Y,Z] = peaks;
surf(X, Y, Z), hold on       % plot surface

[~,h] = contour(X,Y,Z,20);   % plot contour at the bottom
set_contour_z_level(h, -9)
[~,h] = contour(X,Y,Z,20);   % plot contour at the top
set_contour_z_level(h, +9)

hold off
view(3); axis vis3d; grid on

multiple_contour_plots

Вот код для set_contour_z_level функция используется выше:

function set_contour_z_level(h, zlevel)
    % check that we got the correct kind of graphics handle
    assert(isa(handle(h), 'specgraph.contourgroup'), ...
        'Expecting a handle returned by contour/contour3');
    assert(isscalar(zlevel));

    % handle encapsulates a bunch of child patch objects
    % with ZData set to empty matrix
    hh = get(h, 'Children');
    for i=1:numel(hh)
        ZData = get(hh(i), 'XData');   % get matrix shape
        ZData(:) = zlevel;             % fill it with constant Z value
        set(hh(i), 'ZData',ZData);     % update patch
    end
end

HG2:

Вышеупомянутое решение больше не работает, начиная с R2014b. В HG2 объекты контура больше не имеют графических объектов в качестве дочерних ( почему свойство Children для некоторых объектов пусто?).

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

Таким образом, предыдущий пример просто становится:

[X,Y,Z] = peaks;
surf(X, Y, Z), hold on       % plot surface

[~,h] = contour(X,Y,Z,20);   % plot contour at the bottom
h.ContourZLevel = -9;
[~,h] = contour(X,Y,Z,20);   % plot contour at the top
h.ContourZLevel = +9;

hold off
view(3); axis vis3d; grid on

контуры


Другим решением, которое работает во всех версиях, будет "родительский" контур к hgtransform объект, и преобразовать это с помощью простого z-перевода. Что-то вроде этого:

t = hgtransform('Parent',gca);
[~,h] = contour(X,Y,Z,20, 'Parent',t);
set(t, 'Matrix',makehgtform('translate',[0 0 9]));
Другие вопросы по тегам