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

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

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

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

7 ответов

Решение

Кроме того, вы можете жестко закодировать их и иметь if заявление с graphicsversion(fhandle) в теме.

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


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

РЕДАКТИРОВАТЬ: как @thewaywewalk предлагает, вы могли бы открыть Contents.mв matlabroot\toolbox\matlab\graph3d и поиск для % Color maps. Он имеет список цветовых карт, включенных в версию. В 2014b его на линии 29-48

Я не уверен на 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
}

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

В 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 (пожалуйста, проверьте его для вашей версии, если у вас есть другая)

Другой способ (взломать) может быть, чтобы извлечь строку из 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) = [];

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

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 файлы...

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

Вы могли бы использовать exist (То есть, exist('parula', 'file')), или же try пункты, чтобы проверить наличие определенных функций и предложить их в качестве цветовых карт в вашем графическом интерфейсе, хотя это может быть проблематично, если у пользователя есть пользовательские функции с тем же именем, которые не дают цветовых карт.

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

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

Matlab хранит свои палитры как файлы * .m в одном каталоге, поэтому выберите имена файлов в этом каталоге.

      coldir = dir([matlabroot '\toolbox\matlab\graphics\color']);
maps={};
for i=1:length(coldir)
    if coldir(i).isdir, continue, end
    maps{end+1}=replace(coldir(i).name,'.m','');
end
Другие вопросы по тегам