Простой способ получить более разумные цвета в gscatter

Я ищу простой способ заставить gscatter выбирать более разумные цвета.

Как вы можете видеть на картинке ниже, группы 3 и 4 имеют очень похожие цвета, которые трудно различить.

Я рисую свои данные, используя gscatter(X(:,1),X(:,4),assigns , [], [] ).

Я знаю, что могу использовать scatter, чтобы вручную получить более разумные цвета, создав палитру, которая имеет то же количество цветов, что и количество групп, которые у меня есть, но тогда как мне получить красивую легенду, которую создает gscatter, не зацикливаясь на каждой группе?

Итак, есть ли простой (r) способ получить более разумные цвета с помощью gscatter?

Спасибо.

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


person Cassio Pereira    schedule 17.03.2015    source источник


Ответы (2)


Четвертый аргумент gscatter — это спецификация цвета. Согласно документации, для определения цвета можно использовать только буквы:

gscatter(x,y,group,clr,sym,siz) указывает цвет, тип маркера и размер для каждой группы. clr – это строковый массив цветов, распознаваемый функцией plot. По умолчанию для clr используется 'bgrcmyk'.

Но если вы наберете open gscatter и посмотрите на комментарии в первых строках (Matlab справка в старом стиле), сюрприз!

GSCATTER(X,Y,G,CLR,SYM,SIZ) указывает используемые цвета, маркеры и размер
. CLR представляет собой либо строку спецификаций цветов , либо
матрицу спецификаций цветов из трех столбцов
.

Таким образом, вы можете использовать матрицу цветовой карты для определения нужных цветов (по крайней мере, в Matlab R2014b).

Пример:

load discrim
group(1:3:end) = 3; %// borrowing Benoit_11's idea to create two more groups
group(2:2:end) = 4;
cmap = hsv(4); %// define your colormap here
gscatter(ratings(:,1), ratings(:,2), group, cmap)

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


EDIT: в более новых версиях Matlab (я проверил R2019a) в документации упоминается возможность указать цвета в виде матрицы из трех столбцов:

clr: Цвета маркера: вектор символов или строковый скаляр цветов | матрица значений триплетов RGB.

person Luis Mendo    schedule 17.03.2015
comment
Я принимаю ваш ответ, потому что он действительно проще. +1 вам, -1 за недокументированные функции :-( - person Cassio Pereira; 18.03.2015
comment
@CassioPereira Ну, в данном случае я бы не сказал, что это недокументированные функции. Просто они задокументированы в скрытом месте :-) - person Luis Mendo; 18.03.2015
comment
@ Бенуа_11 Спасибо! Ваше решение на самом деле тоже очень хорошее (уже +1) - person Luis Mendo; 18.03.2015

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

Хитрость заключается в том, чтобы назначить вывод во время вызова gscatter, а затем изменить свойство Color. Вы, конечно, можете изменить любое свойство, которое хотите.

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

clear
clc
close all

load discrim

%// Just creating 2 more groups for the demo.
group(1:3:end) = 3;
group(2:2:end) = 4;

figure;

%// Retrieve handles of the scatter plot
hScatter = gscatter(ratings(:,1),ratings(:,2),group);

%// Set colors manually. You can use your own colormap.
for k = 1:numel(hScatter)
set(hScatter(k),'Color',rand(1,3))
end

xlabel('climate');
ylabel('housing');

Выход:

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

person Benoit_11    schedule 17.03.2015