MATLAB 获取颜色映射名称列表

8
我正在编写一个 GUI,需要用户按名称选择颜色映射。然而,我遇到了一个困境,即似乎无法通过程序获取支持的颜色映射名称的列表!
虽然我可以硬编码这些名称;但我的代码可能在较老版本的 matlab 上运行,这些版本可能具有不同的颜色映射。我主要关注的是 parula 颜色映射,如果我没记错的话,在 MATLAB 2014 中并不存在。
你有什么想法吗?

确实。Parula在MATLAB 2014b中被引入,但在2014a中没有。 - Ander Biguri
嘿!人们给了你一些很棒的答案,考虑接受其中一个作为有效答案。 - Ander Biguri
7个回答

7

另外,您可以将它们硬编码,并在其中使用graphicsversion(fhandle)if语句。

如果默认的图形系统是旧的句柄图形系统,则返回true。


您还可以尝试获取一个详细的列表,然后检查matlabroot\toolbox\matlab\graph3d中是否有colormapname.m文件。如果该函数存在,则该版本中包含该颜色映射。但您仍需要硬编码一个详细的列表。

编辑:如@thewaywewalk所建议的那样,您可以在matlabroot\toolbox\matlab\graph3d中打开Contents.m并搜索% Color maps.它列出了该版本中包含的颜色映射列表。在2014b中,它在第29-48行。


1
为了避免硬编码,您可以打开 matlabroot\toolbox\matlab\graph3d\contents.m 并通过对文件进行字符串处理来获取列表。 - Robert Seifert
@thewaywewalk 太棒了!我已经将它添加到答案中了! - Ander Biguri
@thewaywewalk,在该目录中似乎没有我的Matlab 2015a中的contents.m文件。 - warpstack
@warpstack,记得将Contents.m的首字母大写。 - Ander Biguri

4

我不确定它是否适用于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
}

@BillBokeey 哎呀,谢谢您的查看。 - beaker
我很想DV+评论“不是正确的语言” :D - Adriaan
2
@Adriaan 如果人们停止点赞它,我会删除它。但现在看来,也许应该将其作为一个功能请求。 - beaker

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上可以使用(如果你有另一个版本,请检查一下)。

2014b中缺少vga - Ander Biguri

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) = [];

在Windows和Matlab 2014b中缺少“vga”。 - Ander Biguri
2
vga 并不是一个常规的颜色映射,因为它的行为方式与其他映射不同,因此它没有插值。例如,你可以使用 parula(32),但是 vga(32) 将会出错。 - Dan
是的,是的,你说得对。我为这个答案点了赞,我相信它比我的好。我不认为vga对任何事情都有用,只是指出它的缺失,供未来的读者参考。 - Ander Biguri

1
考虑到任何返回3列矩阵或包含此类矩阵变量的MAT文件的函数都可以被colormap使用,因此要求“所有”调色板列表是没有意义的。
您可以使用exist(即exist('parula','file'))或try子句来检查某些函数的存在并将它们作为GUI中的调色板提供,但如果用户具有不产生调色板的相同名称的自定义函数,则可能会出现问题。
我有一些喜欢制作完全定制调色板并将其保存在MAT文件中的用户,因此对于他们,我会将调色板设置为可自定义的文本字段,并进行一些验证以确保它确实是有效的调色板。

这是MATLAB默认包含的所有调色板列表,而不是所有可能的调色板列表,你错过了重点。 - Ander Biguri

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文件...

很好的回答,但我认为应该添加错误检查。 - Ander Biguri
1
@AnderBiguri 我已经尝试添加错误检查和另一种方法。 - Crowley

0

最近我在使用应用程序生成器构建应用程序时遇到了同样的问题。在发现上述尝试过于繁琐之后,我决定提供我的解决方案。

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

MATLAB从哪个版本开始以这种方式存储它们?以前不是这样的。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接