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