2016-05-11 80 views
8

Sto scrivendo una GUI che trarrebbe vantaggio da una selezione utente di mappe colore per nome. Tuttavia, sono un po 'in imbarazzo nel fatto che non riesco a visualizzare a livello di programmazione una lista di nomi di colori supportati!MATLAB Ottenere un elenco di nomi di mappe a colori

Mentre ho potuto hardcode i nomi; il mio codice può essere eseguito su versioni precedenti di matlab che potrebbero avere diversi colori. La mia preoccupazione principale è con la parabola parula che, se ricordo male, non era presente in MATLAB 2014.

Qualche idea?

+0

Infatti. Parula è stato presentato in MATLAB 2014b ma non nel 2014 al –

+0

Hey! la gente ti ha dato alcune risposte interessanti, considera l'accettazione di una di esse come valida –

risposta

7

In alternativa, è possibile codificare e hanno un if dichiarazione con graphicsversion(fhandle) su di esso.

Restituisce restituisce true se il sistema di grafica predefinito è il vecchio handle di grafica uno.


Si potrebbe anche cercare di ottenere una lunga lista, e poi verificare se colormapname.m è un file in matlabroot\toolbox\matlab\graph3d. Se la funzione è presente, la mappa colori è disponibile in quella versione. Avresti comunque bisogno di hardcode un lungo elenco.

EDIT: come suggerisce @thewaywewalk, si potrebbe aprire Contents.m in matlabroot\toolbox\matlab\graph3d e esarch per % Color maps. Ha un elenco delle mappe di colori incluso nella versione. Nella sua 2014b sulle linee 29-48

+1

Per evitare l'hardcoding, è possibile aprire il 'matlabroot \ toolbox \ matlab \ graph3d \ contents.m' e ottenere l'elenco mediante l'elaborazione della stringa del file. – thewaywewalk

+0

@thewaywewalk Brillante! L'ho aggiunto alla risposta! –

+0

@thewaywewalk Non sembra che il mio matlab 2015a abbia questo file content.m in quella directory. – warpstack

4

Io non sono sicuro al 100% che funziona in MATLAB Come sottolinea @BillBokeey nei commenti questo non funziona in MATLAB, ma in Octave è possibile utilizzare:

CM = colormap('list'); 

verrà restituito un matrice di stringhe contenente tutte le mappe di colori valide.

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 
} 
+0

Sembra non funzionare per 2014b @beaker – BillBokeey

+0

@BillBokeey Drat. Grazie per il controllo – beaker

+0

Sono tentato di DV + commento "Non è la lingua giusta": D – Adriaan

4

la possibilità di ottenere un ampio elenco di mappe di colori disponibili:

In matlabroot\help\matlab\ref, è possibile trovare le anteprime di tutte le mappe di colori disponibili i cui nomi di file sono di forma colormap_colormapname.png

In al fine di ottenere la vostra lista, è possibile utilizzare:

uscita
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); 

Questa volontà di un array di celle di stringa contenente i nomi delle mappe di colori disponibili.

abbastanza brutto hack, ma almeno funziona su 2014b (Si prega di controllare per la versione se si dispone di un altro)

+1

Funziona su R2015a. – Adriaan

+0

Manca 'vga' nel 2014b –

2

Un altro modo (hack) potrebbe essere quella di estrarre la stringa la funzione del 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) = []; 
+0

Manca' vga' su Windows e matlab 2014b –

+2

'vga' non è in realtà una normale mappa a colori, si comporta in modo diverso in quanto non ha l'interpolazione delle altre mappe, ad esempio dove puoi usare 'parula (32)', 'vga (32)' è un errore. – Dan

+0

Sì, sì, hai ragione. Ho svalutato questa risposta e credo sia migliore della mia. Non voglio che la vga sia utile per niente, solo per segnalare che manca, per i futuri lettori. –

1

Se tutto fallisce si può provare la routine di callback:

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 

In questo esempio le variabili condivise CMapList - maniglia a t Il menu a comparsa - e Ax - la maniglia degli assi - sono previsti.

Quando viene chiamata la funzione, tenta di impostare la mappa colori. Se fallisce, imposta la mappa colori predefinita e rimuove il nome problematico dal menu.

Assicurarsi che la prima e l'ultima mappa dei colori non causino errori, altrimenti l'aggiornamento CMapList dovrà gestire tali opzioni.


Si può anche beneficiare del fatto, che ogni mappa colore ha un proprio file .m quindi non c'è bisogno di aspettare fino a quando si verifica un errore.

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 

Questo solleva un certo punto - è possibile definire i propri mappe di colori e rendere l'algoritmo per generare mancante .m file ...

+0

Buona risposta, ma credo che l'errore di controllo shoudl essere aggiunto ad esso. –

+1

@AnderBiguri Ho provato ad aggiungere un controllo degli errori e un altro approccio. – Crowley

0

dato che qualsiasi funzione che restituisce una matrice a 3 colonne, o anche un. Il file MAT contenente una variabile cmap con una matrice di questo tipo può essere utilizzato da colormap, non ha senso chiedere un elenco di mappe colore "tutto".

Si potrebbe utilizzare exist (vale a dire, exist('parula', 'file')), o try clausole, per verificare l'esistenza di determinate funzioni e offrire loro come mappe di colori nella vostra interfaccia grafica, anche se questo potrebbe essere problematico se l'utente ha funzioni personalizzate con lo stesso nome che non producono colormaps.

Ho utenti che amano creare mappe colore totalmente personalizzate, che salvano nei file MAT, quindi per loro, renderei la mappa dei colori un campo di testo personalizzabile e fare alcune convalide per garantire che sia effettivamente una mappa dei colori valida.

+0

un elenco di tutte le mappe di colori incluse di default in MATLAB, non un elenco di tutte le mappe di colori possibili, manca il punto –