Цикл с разными цветами в массиве с использованием функции Line в MATLAB - PullRequest
2 голосов
/ 27 марта 2019

Я создал массив цветов для зацикливания при выводе различных графиков.

Где-то в коде он сломан.Я не получаю ошибок, но все же вывод цветов не представляет массив цветов.Выводит последний цвет в массиве для всех строк черного цвета.

figure1 = figure('Color','w');

apples = [3 5 6 3 2]
oranges = [2 3 4 5 6]
grapes = [3 4 3 2 5]
count = [1 2 3 4 5]


C = {'b','r','g','m','k'} 
hold on
for i = 1:5

line(count, apples, 'LineStyle','-','LineWidth', 2, ...
        'Marker','x', 'MarkerSize',10, 'Color',C{i},'DisplayName','apples');

  line(count, oranges, 'LineStyle','-', 'LineWidth', 2, ...
        'Marker','.', 'MarkerSize',10, 'Color',C{i},'DisplayName','oranges');  

line(count, grapes, 'LineStyle','-', ...
        'Marker','.', 'MarkerSize',10, 'Color',C{i},'DisplayName','grapes' );
end
hold off

enter image description here

Ответы [ 2 ]

3 голосов
/ 27 марта 2019

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

line(count, apples, 'LineStyle', '-', 'LineWidth', 2, ...
     'Marker', 'x', 'MarkerSize', 10, ...
     'Color', C{1}, 'DisplayName', 'apples');
line(count, oranges, 'LineStyle', '-', 'LineWidth', 2, ...
     'Marker', '.', 'MarkerSize', 10, ...
     'Color', C{2}, 'DisplayName', 'oranges');
line(count, grapes, 'LineStyle', '-', ...
     'Marker', '.', 'MarkerSize', 10, ...
     'Color', C{3}, 'DisplayName', 'grapes');
              % ^
              % Note this difference

Или вызовите line один раз внутри цикла, например:

data = {apples, oranges, grapes};         % Cell array of your y data
markers = {'x', '.', '.'};                % Cell array of your markers
names = {'apples', 'oranges', 'grapes'};  % Cell array of your names

for iLine = 1:numel(data)
  line(count, data{iLine}, 'LineStyle', '-', ...
       'Marker', markers{iLine}, 'MarkerSize', 10, ...
       'Color', C{iLine}, 'DisplayName', names{iLine});
end

Третий вариант - обновить ColorOrder свойство осей, чтобы оно автоматически (и многократно) переключалось между вашими предпочтительными цветами (определяемыми как тройки RGB). Обратите внимание, что вам придется использовать plot вместо line, чтобы создать свои строки следующим образом:

C = [0 0 1; 1 0 0; 0 1 0; 1 0 1; 0 0 0]; 
set(gca, 'ColorOrder', C);

hold on;
plot(count, apples, 'LineStyle', '-', 'LineWidth', 2, ...
     'Marker', 'x', 'MarkerSize', 10, 'DisplayName', 'apples');
plot(count, oranges, 'LineStyle', '-', 'LineWidth', 2, ...
     'Marker', '.', 'MarkerSize', 10, 'DisplayName', 'oranges');
plot(count, grapes, 'LineStyle', '-', ...
     'Marker', '.', 'MarkerSize', 10, 'DisplayName', 'grapes');
2 голосов
/ 27 марта 2019

Проблема: Как упоминалось в моем комментарии, ваш индекс i варьируется от 1 до 5, и внутри указанного цикла вы каждый раз строите три линии (всего 15 строк).Каждая итерация изменяется при построении трех линий одного цвета (сначала синего, затем красного и т. Д.).

Решение:
Общий подход заключается в разделении графика и свойств графика организованным способом, который автоматизирует нужные части.

Автоматизация цвета : В приведенном ниже коде используется матрица значений RGB, которая называется Cmat.
Свойства общей линии : Общие свойства графика (все линии) настраиваются с помощью for loop.
Свойства отдельных линий: Специфические свойства строки настраиваются с помощью оператора switch.

Я обычно хотел бы оставить DisplayName с вызовом plot только для удобства чтения, но это мое предпочтение, особенно если имена переменных более абстрактны.

% MATLAB R2017a
figure1 = figure('Color','w');
hold on 

apples = [3 5 6 3 2];
oranges = [2 3 4 5 6];
grapes = [3 4 3 2 5];
count = [1 2 3 4 5];


% C = {'b','r','g','m','k'} 
Cmat = [0 0 1; 1 0 0; 0 1 0; .8 0 .2; 0 0 0];   % use a matrix of RGB values

p(1) = plot(count,apples,'DisplayName','apples')      % give plots handles
p(2) = plot(count,oranges,'DisplayName','oranges')
p(3) = plot(count,grapes,'DisplayName','grapes')

% Cosmetics
for j = 1:3                  
    p(j).LineStyle = '-';        % Common plot property adjustments
    p(j).LineWidth = 2;
    p(j).MarkerSize = 10;
    p(j).Color = Cmat(j,:);
    switch j                     % Specific plot property adjustments
        case 1
            p(j).Marker = 'x';   % Marker type for 1st line
        case 2 
            p(j).Marker = '.';
        case 3
            p(j).Marker = '.';
    end
end    
% legend('show')    % include legend

Line chart with different colors

Несомненно, есть более эффективные решения.Я призываю OP и будущих читателей также увидеть этот превосходный ответ из @ gnovice .

...