MATLAB Получить список имен карт цветов

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

Хотя я мог жестко закодировать имена; мой код может быть запущен в более старых версиях Matlab, которые могут иметь разные цветовые карты. Меня больше всего беспокоит цветовая карта parula, которой, если я правильно помню, не было в MATLAB 2014.

Какие-нибудь мысли?


person warpstack    schedule 11.05.2016    source источник
comment
Верно. Парула была представлена ​​в MATLAB 2014b, но не в 2014a.   -  person Ander Biguri    schedule 11.05.2016
comment
Привет! люди дали вам классные ответы, рассмотрите возможность принять один из них как действительный   -  person Ander Biguri    schedule 25.07.2016


Ответы (6)


В качестве альтернативы вы можете жестко закодировать их и иметь оператор if с graphicsversion(fhandle) на нем.

Он возвращает true, если графической системой по умолчанию является старая графическая система дескриптора.


Вы также можете попытаться получить обширный список, а затем проверить, является ли colormapname.m файлом в matlabroot\toolbox\matlab\graph3d. Если функция есть, цветовая карта входит в эту версию. Однако вам все равно нужно жестко закодировать обширный список.

EDIT: как предлагает @thewaywewalk, вы можете открыть Contents.min matlabroot\toolbox\matlab\graph3d и выполнить поиск % Color maps.. В нем есть список цветовых карт, включенных в версию. В 2014b это строки 29-48.

person Ander Biguri    schedule 11.05.2016
comment
Чтобы избежать жесткого кодирования, вы можете открыть matlabroot\toolbox\matlab\graph3d\contents.m и получить список путем обработки строки файла. - person thewaywewalk; 11.05.2016
comment
@thewaywewalk Великолепно! Я добавил это к ответу! - person Ander Biguri; 11.05.2016
comment
@thewaywewalk Не похоже, чтобы в моем Matlab 2015a был этот файл содержимого.m в этом каталоге. - person warpstack; 11.05.2016
comment
@warpstack это Contents.m с большой буквы, на всякий случай. - person Ander Biguri; 11.05.2016

Я не уверен на 100%, что это работает в MATLAB Как отмечает @BillBokeey в комментариях, это не работает в MATLAB, но в Octave вы можете использовать:

CM = colormap('list');

Он вернет массив ячеек строк, содержащих все допустимые цветовые карты.

CM =
{
  [1,1] = autumn
  [1,2] = bone
  [1,3] = cool
  [1,4] = copper
  [1,5] = flag
  [1,6] = gmap40
  [1,7] = gray
  [1,8] = hot
  [1,9] = hsv
  [1,10] = jet
  [1,11] = lines
  [1,12] = ocean
  [1,13] = pink
  [1,14] = prism
  [1,15] = rainbow
  [1,16] = spring
  [1,17] = summer
  [1,18] = white
  [1,19] = winter
}
person beaker    schedule 11.05.2016
comment
@BillBokeey Драт. Спасибо за проверку. - person beaker; 11.05.2016
comment
Меня соблазняет DV+комментировать Не тот язык :D - person Adriaan; 11.05.2016
comment
@Adriaan Если бы люди перестали голосовать за него, я бы удалил его. В нынешнем виде, возможно, это должно стать запросом функции. - person beaker; 11.05.2016

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

В matlabroot\help\matlab\ref вы можете найти предварительный просмотр всех доступных цветовых карт, имена файлов которых имеют форму colormap_colormapname.png

Чтобы получить свой список, вы можете использовать:

CurrFolder=pwd;

cd(strcat(matlabroot,'\help\matlab\ref'))

Colormaps=dir('*colormap_*.png');

TmpColormapsList={Colormaps.name};

TmpColormapsList=cellfun(@(S)strrep(S,'colormap_',''),TmpColormapsList,'UniformOutput',false);

ColormapsList=cellfun(@(S)strrep(S,'.png',''),TmpColormapsList,'UniformOutput',false);

cd(CurrFolder);

Это выведет массив ячеек строки, содержащий имена доступных цветовых карт.

Довольно уродливый хак, но, по крайней мере, он работает на 2014b (пожалуйста, проверьте его для своей версии, если у вас есть другая)

person BillBokeey    schedule 11.05.2016
comment
Пропал без вести vga в 2014 г.b - person Ander Biguri; 11.05.2016

Другой способ (хак) может состоять в том, чтобы извлечь строку из функции colormapeditor:

colormapeditorString = fileread(strcat(matlabroot,'\toolbox\matlab\graph3d\colormapeditor.m'));
posStart = strfind(colormapeditorString,'stdcmap(maptype');
posEnd = strfind(colormapeditorString(posStart:end),'end') + posStart;
stdcmapString = colormapeditorString(posStart:posEnd);
split = strsplit(stdcmapString, '(mapsize)');
list = cellfun(@(x)x(find(x==' ', 1,'last'):end), split,'uni',0);
list(end) = [];
person Dan    schedule 11.05.2016
comment
Отсутствует vga в Windows и Matlab 2014b - person Ander Biguri; 11.05.2016
comment
vga на самом деле не является обычной цветовой картой, она ведет себя по-другому, поскольку не имеет интерполяции, которую делают другие карты, например, где вы можете перейти parula(32), vga(32) является ошибкой. - person Dan; 11.05.2016
comment
Да, да, вы правы. Я проголосовал за этот ответ и считаю, что он лучше моего. Я не думаю, что vga полезен для чего-либо, просто указываю на то, что отсутствует, для будущих читателей. - person Ander Biguri; 12.05.2016

Если ничего не помогает, вы можете попробовать процедуру обратного вызова:

function=ChangeCMap()
  CMList=get(CMapList,'string');                            %% Read colormap names
  CMVal =get(CMapList,'value');                             %% Get the index of desired colormap

  try
    colormap(Ax,CMList{CMVal});                             %% Try to set the colormap...
  catch Msg                                                 %% ... if it fails, then:
    if strcmp(Msg.stack.name,'colormap')                    %% Check if error was caused by colormap function
      set(Ax,'colormap`,'jet');                             %% set "default" colormap (optional)
      indices=1:length(CMList);
      set(CMapList,'string',CMList{indices~=CMVal})         %% remove the colormap name thet caused error
    else
      disp(Msg)                                             %% Print the error message in matlab shell
    end
  end
end

В этом примере ожидаются общие переменные CMapList - дескриптор всплывающего меню - и Ax - дескриптор осей.

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

Убедитесь, что первая и последняя карты цветов не вызовут ошибки, иначе обновление CMapList должно будет обрабатывать эти параметры.


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

CMap='bone';   %% example
if exist(CMap,'file')
  colormap(Ax,CMap)  %% bone.m exist somewhere in the matlab paths
else
  colormap(Ax,'jet') %% bone.m does not exist in the matlab paths
end

Это поднимает один вопрос — вы можете определить свои собственные цветовые карты и заставить алгоритм генерировать отсутствующие .m файлы...

person Crowley    schedule 11.05.2016
comment
Хороший ответ, но я считаю, что к нему следует добавить проверку ошибок. - person Ander Biguri; 11.05.2016
comment
@AnderBiguri Я пытался добавить проверку ошибок и другой подход. - person Crowley; 11.05.2016

Учитывая, что любая функция, возвращающая матрицу с тремя столбцами, или даже файл .MAT, содержащий переменную cmap с такой матрицей, может использоваться colormap, не имеет смысла запрашивать список «всех» цветовых карт.

Вы можете использовать предложения exist (т. дают цветовые карты.

У меня есть пользователи, которым нравится создавать полностью настраиваемые карты цветов, которые они сохраняют в файлах MAT, поэтому для них я бы сделал карту цветов настраиваемым текстовым полем и провел некоторую проверку, чтобы убедиться, что это действительно действительная карта цветов.

person Ahmed Fasih    schedule 11.05.2016
comment
список всех цветовых карт, включенных по умолчанию в MATLAB, а не список всех возможных цветовых карт, вы упускаете суть - person Ander Biguri; 19.05.2016