Преобразуйте стандартные цвета из старой палитры в новую.

Если я открою ранее (до R2014b) сохраненную фигуру, цвета, которые я использовал, например r, k, ..., появятся в соответствии с цветовой картой, с которой они были сохранены. Как быстро преобразовать цвета в эквивалентные им цвета в новой цветовой карте parula. Под эквивалентными цветами я подразумеваю стандартную последовательность цветов, которую MATLAB использует, когда мы используем команду hold on после каждой команды plot, не устанавливая свойство цвета в `графике'. что-то вроде этого:

plot(x,y1);hold on;plot(x,y2);

Это должно быть в значительной степени автоматическим, если я изменю цветовую карту графика по умолчанию, но это не так. Есть ли команда для этого?

Графики, которые у меня есть, включают в себя более 20 кривых каждый, что раздражает вручную менять цвета.


person NKN    schedule 28.01.2015    source источник
comment
Как вы определяете эту эквивалентность? В hold all смысле?   -  person Luis Mendo    schedule 29.01.2015
comment
@LuisMendo отредактировал вопрос.   -  person NKN    schedule 29.01.2015


Ответы (1)


Следующее, кажется, работает.

open example_figure.fig %// open old file in R2014b
ax = gca;
ch = ax.Children; %// the children are lines or other objects
co = ax.ColorOrder; %// this is the new set of colors
M = size(co,1);
p = 1; %// index of new color
for n = numel(ch):-1:1 %// start with lines plotted earlier. These have higher index
    if strcmp(ch(n).Type,'line') %// we are only interested in lines
        ch(n).Color = co(mod(p-1,M)+1,:); %// cycle through new colors
        p = p + 1; %// increase color index
    end
end

Суть в том, что, как указано в блог Лорен,

Цвета линий, используемые на графиках, контролируются свойством ColorOrder объекта Axes.

Это свойство, в котором хранятся новые hold on цвета, используемые в R2014b. Но это свойство применяется к вновь построенным линиям, а не к уже присутствующим в файле. Итак, мой код выше применяет цвета, определенные ColorOrder, к Children осей, которые имеют тип 'line'.

Я заметил (по крайней мере, в R2010b), что более новые графики имеют более низкие индексы в массиве children. То есть, когда новый график добавляется к осям, он получает первую позицию в массиве Children, перемещая старые графики к более высоким индексам. Вот почему в цикле for выше индекс дочерних элементов (n) убывает, а индекс нового цвета (p) возрастает. Это гарантирует, что линия, которая была построена первой (более высокий индекс), получит первый из новых цветов и т. д.

В качестве примера создадим фигуру в R2010b:

plot(1:3, 'b')
hold on
plot(4:6, 'r')
plot(7:9, 'g')

введите здесь описание изображения
Преобразованный рисунок

введите здесь описание изображения

person Luis Mendo    schedule 28.01.2015
comment
Да, это работает. Хотя я собираюсь использовать его на фигурах, состоящих не только из линий, это может стать проблемой. Но я думаю, что я могу справиться с этим сейчас. Спасибо! - person NKN; 29.01.2015
comment
@NKN Я внес изменения, чтобы попытаться сохранить порядок цветов. то есть применить первый из новых цветов (средний синий) к линии, которая была нанесена первой и т. д. - person Luis Mendo; 29.01.2015
comment
@NKN Я добавил if в цикл, чтобы выбирать только строки - person Luis Mendo; 29.01.2015
comment
Я видел, очень красиво. Спасибо! - person NKN; 29.01.2015