2016-05-11 3 views
8

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

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

Любые мысли?

+0

Действительно. Parula был представлен в MATLAB 2014b, но не в 2014 году. –

+0

Эй! люди дали вам некоторые интересные ответы, подумайте о принятии одного из них как действительного –

ответ

7

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

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


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

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

+1

Чтобы избежать жесткого кодирования, вы можете открыть 'matlabroot \ toolbox \ matlab \ graph3d \ contents.m' и получить список путем строковой обработки файла. – thewaywewalk

+0

@thewaywewalk Блестящий! Я добавил это к ответу! –

+0

@thewaywewalk Не похоже, что мой matlab 2015a имеет этот файл contents.m в этом каталоге. – warpstack

4

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

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 
} 
+0

Кажется, не работает для 2014b @beaker – BillBokeey

+0

@BillBokeey Drat. Спасибо за проверку. – beaker

+0

У меня возникает соблазн DV + комментарий «Не правильный язык»: D – Adriaan

4

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

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

+1

Работы на R2015a. – Adriaan

+0

Отсутствует 'vga' в 2014b –

2

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

Отсутствует' vga' на Windows и matlab 2014b –

+2

'vga' на самом деле не является обычной цветной картой, но она ведет себя по-другому, поскольку у нее нет интерполяции, которую делают другие карты, например, где вы можете пойти 'parula (32)', 'vga (32)' является ошибкой. – Dan

+0

Да, да, вы правы. Я поддержал этот ответ, и я считаю, что это лучше, чем мое. Я не хочу, чтобы vga был полезен для любых вещей, просто указывая на то, что отсутствует, для будущих читателей. –

1

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

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

+0

Хороший ответ, но я считаю, что к нему добавляется ошибка проверки shoudl. –

+1

@AnderBiguri Я попытался добавить проверку ошибок и другой подход. – Crowley

0

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

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

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

+0

список всех цветовых карт, включенных по умолчанию в MATLAB, а не список всех возможных цветовых палитр, вам не хватает точки –