我正在编写一个GUI,它将受益于用户选择的名称颜色映射。但是,我有点陷入困境,因为我无法以编程方式获得支持的色彩映射名称列表!
虽然我可以对名字进行硬编码;我的代码可以在旧版本的matlab上运行,它可能有不同的颜色映射。我主要关注的是 parula 色彩映射,如果我没记错的话,它在MATLAB 2014中没有出现。
有什么想法吗?
答案 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文件中,因此对于他们来说,我会将色彩图制作为可自定义的文本字段,并进行一些验证以确保它确实是有效的色彩映射。