Как настроить метки контурных линий? - PullRequest
0 голосов
/ 24 ноября 2018

Я хотел бы визуализировать функцию двух переменных в контурном графике, используя Octave, и наложить на нее настраиваемые метки линий.

Основываясь на документации Octave, я написал:

clf;
colormap ("default");
[x, y, z] = peaks ();
subplot(2,1,1);
contour (x, y, z,'showtext', 'on');
title ({"contour() plot, showtext on"; "Z = peaks()"});
subplot(2,1,2);
[ctr, h] = contour (x, y, z);
cll = clabel(ctr, h, 'backgroundcolor',[1 1 1]);
title ({"contour() plot, using clabel()"; "Z = peaks()"});

Two more or less identical plots produced by the code snippet above

, который дает два лишь незначительно (если вообще) разных графика.Этикетки есть, но выглядят не очень хорошо;Мне нужно лучшее качество для этого проекта.

Что я хотел бы сделать, это в порядке приоритета:

  1. Показывать метки только с 2 - 3 десятичными цифрами.
  2. Измените фон метки на белый.
  3. Нанесите метки на линию с контурной линией.

Из документации Octave видно, что значения меток хранятся в "userdata", но этоне очень помогает, потому что:

>> get(cll, "userdata")
ans =
{
  [1,1] =  6.7459
  [2,1] =  5.4167
  [3,1] =  5.4167
  [4,1] =  4.0874
  [5,1] =  4.0874
  [6,1] =  2.7581
  [7,1] =  2.7581
  [8,1] =  2.7581
  [9,1] =  2.7581
  [10,1] =  1.4289
  [11,1] =  1.4289
  [12,1] =  1.4289
  [13,1] =  1.4289
  [14,1] =  0.099636
  [15,1] =  0.099636
  [16,1] =  0.099636
  [17,1] =  0.099636
  [18,1] =  0.099636
  [19,1] =  0.099636
  [20,1] = -1.2296
  [21,1] = -1.2296
  [22,1] = -1.2296
  [23,1] = -1.2296
  [24,1] = -2.5589
  [25,1] = -2.5589
  [26,1] = -2.5589
  [27,1] = -3.8881
  [28,1] = -5.2174

Я не уверен, как определяется количество повторений для значения.Буду признателен за помощь в этом вопросе.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Ну, я использовал ваши предложения и немного поработал с моими реальными данными, чтобы получить этот график:

enter image description here

Что хорошо для моегонуждается, за исключением этого одинокого «0,09» в левой части сюжета.Этого не должно быть, но я не могу понять, почему это появляется.

set(gca,'children',flip(get(gca,'children'))) не работает, хотя.

0 голосов
/ 24 ноября 2018

Чтобы отобразить метки с меньшим количеством цифр, лучше всего вручную указать, при каких значениях z рисовать контурные линии (см. Пояснения в документации к contourc):

colormap('default');
[x, y, z] = peaks();
vn = ceil(min(z(:))):floor(max(z(:))); % list of all integer values within range of data
contour(x, y, z, vn, 'showtext', 'on');
title({"contour() plot, showtext on"; "Z = peaks()"});

Вы также можете указать, на какие линии контура наносить метки:

colormap('default');
[x, y, z] = peaks();
vn = ceil(min(z(:))):floor(max(z(:)));
[ctr, h] = contour(x, y, z, vn);
clabel(ctr, h, vn(1:2:end), 'backgroundcolor',[1 1 1]);
title({"contour() plot, showtext on"; "Z = peaks()"});

У меня здесь нет Octave, но аргумент 'background color' должен сработать.Возможно, что линии нарисованы над текстом, а не над линиями.В MATLAB есть команда uistack для принудительного задания порядка рисования, но в Octave этого, похоже, не существует.Там одна возможность может заключаться в изменении порядка дочерних объектов объекта оси:

set(gca,'children',flip(get(gca,'children')))

(Примечание: MATLAB contour лучше выбирает хорошие уровни контуров,и он также по умолчанию прерывает строку, в которой находятся метки, поэтому строки и текст не пересекаются.)

...