Как установить пользовательский маркер в легенде фигуры MATLAB - PullRequest
0 голосов
/ 12 июня 2018

У меня есть изображение следующим образом.

enter image description here На этих изображениях вы можете видеть 3 строки, на самом деле это 6 строк, одна строка невидима только для отображения маркеров, а другаяЛиния - это сглаженная версия исходных точек данных.Теперь вопрос в том, как мне получить маркеры в легенде.В этом случае вы можете увидеть легенду фигуры, состоящую только из линии, а не маркеров.Мой код выглядит следующим образом.

clc; clear all ;

colour_green = [12 195 82] ./ 255;
colour_lightgreen = [94 250 81] ./ 255;
colour_lightblue = [8 180 238] ./ 255;
colour_darkblue = [1 17 181] ./ 255;
colour_peach = [251 111 66] ./ 255;

figure('DefaultAxesFontSize',30);
set(0,'DefaultAxesFontName',' Times  ');
hold on 


time_window = xlsread('pattern_data.xlsx', 'effect_of_count', 'A2:A12');
count1plus = xlsread('pattern_data.xlsx', 'effect_of_count', 'B2:B12');
count10plus = xlsread('pattern_data.xlsx', 'effect_of_count', 'C2:C12');
count1to5 = xlsread('pattern_data.xlsx', 'effect_of_count', 'D2:D12');


 x1 = 50:1:99;
%  x1 = .01:.01:.5;


x2 = interp1(time_window,count1plus,x1, 'pchip') ;
x3 = interp1(time_window,count10plus,x1, 'pchip') ;
x4 = interp1(time_window,count1to5,x1, 'pchip') ;


   % count 1+
plot(x1,x2,'b--','DisplayName', 'Count_{A} = 1: and Count_{B} = 1:','LineWidth',3) 
plot(time_window,count1plus,'bs', 'HandleVisibility','off','LineWidth',5)

   % count 1:5
plot(x1,x4,'-','DisplayName', 'Count_{A} = 1: and Count_{B} = 5:','LineWidth',3 ,  'Color', colour_green) 
plot(time_window,count1to5,'^', 'HandleVisibility','off','LineWidth',5 ,  'Color', colour_green)

   % count 10+
plot(x1,x3,'r--','DisplayName', 'Count_{A} = 1: and Count_{B} = 10:','LineWidth',3) 
plot(time_window,count10plus,'ro', 'HandleVisibility','off','LineWidth',5)


hold off


xlabel('Th_{B} ')
ylabel('L (milliseconds)')
legend('Location','north')
legend show

set(gcf, 'PaperUnits', 'normalized');
set(gcf, 'PaperPosition', [0 0 1 1]);
set(gcf,'PaperOrientation','l');
print -dpng graphs/p1_effect_of_count_and_selB;

Пожалуйста, помогите.Я хочу иметь маркер (круг, квадрат и т. Д.) В соответствующей легенде.

Правка # 1

Решение, предоставленное здесь , не решило мою проблемукак это не иллюстрирует, как добавить маркер.Анимация показывает, как настроить положение маркера, но здесь я хочу добавить новый маркер, а не заново позиционировать существующий.

1 Ответ

0 голосов
/ 12 июня 2018

Как объяснено в , этот ответ на очень похожий вопрос , поскольку начиная с R2014b, объект легенды является непрозрачным и не может быть легко изменен.Однако этот ответ также показывает, что существует синтаксис для функции legend с четырьмя выходными аргументами, которая создает легенду другим способом, так что ее можно изменить.Ответ также показывает, как изменить легенду.Мы последуем их примеру.

В документации говорится об этом синтаксисе:

Этот синтаксис не рекомендуется.Он создает легенду, которая не поддерживает некоторые функции, такие как добавление заголовка легенды.Кроме того, легенда не обновляется автоматически, когда вы добавляете или удаляете ряды данных из осей.

Но в этом случае эти проблемы нас не беспокоят, поэтому мы продолжим.

В случае графика в вопросе мы заменим

legend('Location','north')

на

[lgd,icons,plots,txt] = legend('Location','north');

Теперь icons содержит дескрипторы объектов, которые образуют легенду:

>> icons

icons = 

  9×1 graphics array:

  Text    (Count_{A} = 1: and Count_{B} = 1:)
  Text    (Count_{A} = 1: and Count_{B} = 5:)
  Text    (Count_{A} = 1: and Count_{B} = 10:)
  Line    (Count_{A} = 1: and Count_{B} = 1:)
  Line    (Count_{A} = 1: and Count_{B} = 1:)
  Line    (Count_{A} = 1: and Count_{B} = 5:)
  Line    (Count_{A} = 1: and Count_{B} = 5:)
  Line    (Count_{A} = 1: and Count_{B} = 10:)
  Line    (Count_{A} = 1: and Count_{B} = 10:)

Дисплей даже услужливо показывает, какие элементы принадлежат к какому элементу.Первые три являются текстовыми объектами, последние 6 являются строковыми объектами.Эти линейные объекты - это то, что нам нужно изменить.

Почему есть два линейных объекта для каждого из элементов, показанных в легенде?Это связано с тем, что существует один линейный объект (первый), который представляет собой отрисованную линию (у нее есть две точки данных):

>> icons(4)

ans = 

  Line (Count_{A} = 1: and Count_{B} = 1:) with properties:

              Color: [0 0 1]
          LineStyle: '--'
          LineWidth: 3
             Marker: 'none'
         MarkerSize: 6
    MarkerFaceColor: 'none'
              XData: [0.0108 0.0919]
              YData: [0.8246 0.8246]
              ZData: [1×0 double]

, а другой - маркер (в настоящее время не видимый, у него есть одинточка данных):

>> icons(5)

ans = 

  Line (Count_{A} = 1: and Count_{B} = 1:) with properties:

              Color: [0 0 1]
          LineStyle: 'none'
          LineWidth: 3
             Marker: 'o'
         MarkerSize: 6
    MarkerFaceColor: 'none'
              XData: 0.0514
              YData: 0.8246
              ZData: [1×0 double]

Итак, нам нужно установить следующие объекты маркеров:

icons(5).Marker = 's';
icons(7).Marker = '^';
icons(9).Marker = 'o';

Теперь график выглядит так, как вы хотели.

IНадеюсь, что приведенное выше описание достаточно ясно, что теперь вы можете изменить легенду и другими способами.

...