MATLAB获取颜色映射名称列表

时间:2016-05-11 14:01:28

标签: matlab user-interface colormap

我正在编写一个GUI,它将受益于用户选择的名称颜色映射。但是,我有点陷入困境,因为我无法以编程方式获得支持的色彩映射名称列表!

虽然我可以对名字进行硬编码;我的代码可以在旧版本的matlab上运行,它可能有不同的颜色映射。我主要关注的是 parula 色彩映射,如果我没记错的话,它在MATLAB 2014中没有出现。

有什么想法吗?

6 个答案:

答案 0 :(得分:7)

或者,您可以对它们进行硬编码,并在其上添加if语句graphicsversion(fhandle)

  

如果默认图形系统是旧系统,则返回true   处理图形。

您还可以尝试获取广泛的列表,然后检查colormapname.m中的matlabroot\toolbox\matlab\graph3d是否为文件。如果函数在那里,那么colormap就会出现在那个版本中。您仍然需要对广泛的列表进行硬编码。

编辑:正如@thewaywewalk建议的那样,您可以在Contents.m中打开matlabroot\toolbox\matlab\graph3d并在% Color maps.中查看它有一个包含在版本中的彩色地图列表。在2014b,它在29-48行

答案 1 :(得分:4)

我并非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
}

答案 2 :(得分:4)

有可能获得大量可用的色彩映射表:

// sizeof (IntChar) == 8 struct IntChar { uint32_t i; // 4 bytes char c; // 1 byte // 3 bytes of padding }; // sizeof (TwoIntChars) == 16 struct TwoIntChars { struct IntChar a, b; // 6 bytes of padding }; // sizeof (CompactTwoIntChars) == 12 struct CompactTwoIntChars { uint32_t a, b; // 8 bytes of ints char c, d; // 2 bytes of chars // 2 bytes of padding }; 中,您可以找到其文件名格式为matlabroot\help\matlab\ref

的所有可用色彩映像的预览

要获取列表,您可以使用:

colormap_colormapname.png

这将输出一个包含可用色图名称的字符串数组。

非常丑陋的黑客,但至少它适用于2014b(如果你有另一个,请检查你的版本)

答案 3 :(得分:2)

另一种方式(hack)可能是从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) = [];

答案 4 :(得分: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文件......

答案 5 :(得分:0)

鉴于cmap可以使用任何返回3列矩阵的函数,甚至包含带有此类矩阵的colormap变量的.MAT文件的函数,它都没有意义要求提供“所有”色彩图列表。

您可以使用exist(即exist('parula', 'file'))或try子句来检查某些功能是否存在,并在GUI中将它们作为色彩映射提供,尽管可能是如果用户具有不会产生色彩映射的同名自定义函数,则会出现问题。

我喜欢制作完全自定义色彩图的用户,他们将这些色彩图保存在MAT文件中,因此对于他们来说,我会将色彩图制作为可自定义的文本字段,并进行一些验证以确保它确实是有效的色彩映射。