我正在編寫一個GUI,它可以從用戶選擇顏色映射的名稱中受益。不過,我有點尷尬,因爲我似乎無法通過編程獲得受支持的顏色映射名稱列表!MATLAB獲取顏色映射名稱列表
雖然我可以硬編碼名稱;我的代碼可能會運行在老版本的matlab上,它可能有不同的色彩映射。我主要關心的是parula色圖,如果我沒記錯的話,它在MATLAB 2014中不存在。
有什麼想法?
我正在編寫一個GUI,它可以從用戶選擇顏色映射的名稱中受益。不過,我有點尷尬,因爲我似乎無法通過編程獲得受支持的顏色映射名稱列表!MATLAB獲取顏色映射名稱列表
雖然我可以硬編碼名稱;我的代碼可能會運行在老版本的matlab上,它可能有不同的色彩映射。我主要關心的是parula色圖,如果我沒記錯的話,它在MATLAB 2014中不存在。
有什麼想法?
或者,您可以硬編碼他們,有一個if
語句graphicsversion(fhandle)
就可以了。
如果默認圖形系統是舊的 句柄圖形,則返回true。
您也可以嘗試得到了廣泛的列表,然後檢查是否colormapname.m
是matlabroot\toolbox\matlab\graph3d
文件。如果該功能在那裏,那麼色彩映射就會在該版本中出現。儘管如此,您仍然需要對廣泛的列表進行硬編碼。
編輯:爲@thewaywewalk建議,你可以在matlabroot\toolbox\matlab\graph3d
和esarch打開Contents.m
爲% Color maps.
它具有色彩映射表中包括的版本列表。在2014B上線了29-48
爲了避免硬編碼,你可以打開'matlabroot \ toolbox \ matlab \ graph3d \ contents.m'並通過文件的字符串處理來獲取列表。 – thewaywewalk
@thewaywewalk精彩!我已經添加到答案! –
@thewaywewalk它似乎沒有,我的matlab 2015a在該目錄中有這個contents.m文件。 – warpstack
我不是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
}
似乎不適用於2014b @beaker – BillBokeey
@BillBokeey Drat。感謝您的檢查。 – beaker
我很想DV +評論「不是正確的語言」:D – Adriaan
的可能性得到了廣泛的可用色彩映射列表:
在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(請檢查您的版本,如果您有其它的)
適用於R2015a。 – Adriaan
在2014b中缺少'vga' –
另一種方式(破解),可能是提取字符串出了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上缺少'vga' 2014b –
'vga'雖然不是一個真正的常規彩色映射,但它的行爲不同,因爲它沒有其他映射所做的插值,例如,你可以去'parula(32)','vga(32)'是一個錯誤。 – Dan
是的,是的,你是對的。我提出了這個答案,我相信比我更好。對於任何事物,我都不會有什麼用處,只是指出缺失,對於未來的讀者。 –
如果一切失敗,您可以嘗試回調例程:
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
- 處理到t他彈出菜單 - 和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
文件...
很好的答案,但我相信錯誤檢查shoudl將被添加到它。 –
@AnderBiguri我試着添加錯誤檢查和另一種方法。 – Crowley
鑑於返回一個3列的矩陣,甚至是任何功能。 MAT文件包含cmap
變量與這樣一個矩陣,可以使用colormap
,要求一個「所有」色彩表的列表是沒有意義的。
您可以使用exist
(即exist('parula', 'file')
),或try
條款,來檢查的某些功能的存在,併爲他們提供在你的GUI色彩映射表,雖然這可能是有問題的,如果用戶自定義函數名稱相同不會產生色彩映射。
我有喜歡製作完全自定義顏色映射的用戶,他們將這些顏色保存在MAT文件中,所以對於他們來說,我會將顏色映射設置爲可自定義的文本框,並進行一些驗證以確保它確實是有效的顏色映射。
MATLAB中默認包含的所有顏色映射的列表,而不是所有可能的顏色映射的列表,您錯過了該點 –
確實。 Parula在MATLAB 2014b中提供,但不在2014a中 –
嘿!人們給你一些很酷的答案,考慮接受其中一個有效 –