Создание статичной легенды, независимой от реального сюжета - PullRequest
3 голосов
/ 16 января 2012

Я строю две поверхности в Matlab, уровень земли постоянен, а уровень воды меняется во времени.

Я использую оператор if для изменения colormap воды с увеличением глубины, определяемой двумя пороговыми значениями (в коде ниже пороговые значения представлены массивом C)

if max(C(:)) < 2
    colormap([0.5 0.25 0 ; 0 0.8 1]);
elseif max(C(:)) >= 2 && max(C(:)) < 3
    colormap([0.5 0.25 0 ; 0 0.8 1 ; 0 0.5 0.65]);
elseif max(C(:)) >= 3
    colormap([0.5 0.25 0 ; 0 0.8 1 ; 0 0.5 0.65 ; 0 0.2 0.3]);
end

В результате, когда уровень воды ниже порога 1, он становится голубым, между двумя порогами становится темнее, а выше порога 2 он становится еще темнее.

Моя проблема в том, что когда я рисую легенду

legend('ground','water');

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

  1. (коричневый) молотый
  2. (светло-синий) Уровень воды ниже порога 1
  3. (стандартная синяя) Уровень воды между порогами
  4. (темно-синий) Уровень воды выше порога 2

Единственное решение, которое я могу придумать, - это сделать 3 аккуратных маленьких пятна где-то у оси (где это не будет замечено) в правильных синих цветах, а затем сделать так, чтобы легенда указывала на них, а не на поверхность воды. Но это было бы настоящим дерьмовым решением ...

1 Ответ

0 голосов
/ 16 января 2012

Вы можете отобразить цветную полосу ():

C = [1 2 3 4];

if max(C(:)) < 2
    colormap([0.5 0.25 0 ; 0 0.8 1]);
elseif max(C(:)) >= 2 && max(C(:)) < 3
    colormap([0.5 0.25 0 ; 0 0.8 1 ; 0 0.5 0.65]);
elseif max(C(:)) >= 3
    colormap([0.5 0.25 0 ; 0 0.8 1 ; 0 0.5 0.65 ; 0 0.2 0.3]);
end

% whatever to make your plot
imagesc(C);

% display a colorbar
cb_ax = colorbar;

% label it appropriately
set(cb_ax, 'YTick', [1:4]*3/4+5/8, 'YTickLabels', {'A', 'B', 'C', 'D'});
...