2016-05-11 4 views
8

J'écris une interface graphique qui bénéficierait d'une sélection de cartes de couleurs par l'utilisateur. Cependant, je suis un peu embarrassant en ce sens que je n'arrive pas à obtenir par programme une liste de noms de couleurs compatibles!MATLAB Obtenir une liste de noms de cartes de couleurs

Bien que je puisse coder en dur les noms; mon code peut être exécuté sur des anciennes versions de matlab qui peuvent avoir des cartes de couleurs différentes. Ma principale préoccupation est avec le parula colormap qui, si je me souviens bien, n'était pas présent dans MATLAB 2014.

Des pensées?

+0

En effet. Parula a été présenté dans MATLAB 2014b mais pas en 2014a –

+0

Hey! les gens vous ont donné des réponses cool, pensez à accepter l'un d'entre eux comme valide –

Répondre

7

Alternativement, vous pouvez les coder en dur et ont une déclaration if avec graphicsversion(fhandle) sur elle.

Il retourne vrai si le système graphique par défaut est l'ancien gérer les graphiques.


Vous pouvez également essayer d'obtenir une liste complète, puis vérifier si colormapname.m est un fichier dans matlabroot\toolbox\matlab\graph3d. Si la fonction est là, la palette de couleurs vient dans cette version. Vous auriez quand même besoin de coder une longue liste.

EDIT: comme @thewaywewalk suggère, vous pouvez ouvrir Contents.m dans matlabroot\toolbox\matlab\graph3d et esarch pour % Color maps. Il a une liste des colormaps inclus dans la version. Dans son 2014b sur les lignes 29-48

+1

Pour éviter le codage en dur, vous pouvez ouvrir le fichier 'matlabroot \ toolbox \ matlab \ graph3d \ contents.m et obtenir la liste par traitement de chaîne du fichier. – thewaywewalk

+0

@thewaywewalk Brillant! J'ai ajouté cela à la réponse! –

+0

@thewaywewalk Il ne semble pas que mon matlab 2015a ait ce fichier contents.m dans ce répertoire. – warpstack

4

Je ne suis pas 100% sûr qu'il fonctionne en tant que Matlab @BillBokeey souligne dans les commentaires cela ne fonctionne pas dans Matlab, mais Octave vous pouvez utiliser:

CM = colormap('list'); 

Il retournera un tableau de chaînes de chaînes contenant toutes les cartes de couleurs valides.

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

Ne semble pas fonctionner pour 2014b @beaker – BillBokeey

+0

@BillBokeey Drat. Merci d'avoir vérifié. – beaker

+0

Je suis tenté de DV + commenter "Pas la bonne langue": D – Adriaan

4

la possibilité d'obtenir une liste complète des colormaps disponibles:

En matlabroot\help\matlab\ref, vous pouvez trouver des aperçus de tous les colormaps disponibles dont les noms de fichiers sont de la forme colormap_colormapname.png

En afin d'obtenir votre liste, vous pouvez utiliser:

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

Affichera un réseau de cellules de chaîne contenant les noms des colormaps disponibles.

bidouille assez laid, mais au moins cela fonctionne sur 2014b (S'il vous plaît vérifier votre version si vous avez un autre)

+1

Fonctionne sur R2015a. – Adriaan

+0

Missing 'vga' en 2014b –

2

Une autre façon (pirater) peut-être pour en extraire la chaîne la fonction 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

Missing' vga' sur Windows et matlab 2014b –

+2

'vga' n'est pas vraiment une carte de couleur normale, il se comporte différemment car il n'a pas l'interpolation les autres cartes le font par exemple où vous pouvez aller 'parula (32)', 'vga (32)' est une erreur. – Dan

+0

Oui, oui, vous avez raison. J'ai augmenté cette réponse et je crois qu'elle est meilleure que la mienne. Je ne pense pas que vga est utile pour n'importe quoi, juste en soulignant que c'est manquant, pour les futurs lecteurs. –

1

Si tout échoue, vous pouvez essayer la routine de rappel:

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 

Dans cet exemple, les variables partagées CMapList - gérer à t Le menu contextuel - et Ax - poignée des axes - sont attendus. Lorsque la fonction est appelée, elle tente de définir la palette de couleurs. En cas d'échec, définissez la palette de couleurs par défaut et supprimez le nom problématique du menu.

Assurez-vous que les premières et dernières cartes de couleurs ne provoqueront pas d'erreur, sinon la mise à jour CMapList devra gérer ces options.


Vous pouvez également profiter du fait que chaque palette de couleurs a son propre fichier .m de sorte que vous n'avez pas besoin d'attendre jusqu'à ce que l'erreur se produit.

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 

Cela soulève un point - vous pouvez définir vos propres palettes de couleurs et de faire l'algorithme pour générer des fichiers manquants .m ...

+0

Bonne réponse, mais je crois que la vérification d'erreur devrait y être ajoutée. –

+1

@AnderBiguri J'ai essayé d'ajouter une vérification d'erreur et une autre approche. – Crowley

0

Étant donné que toute fonction qui renvoie une matrice 3 colonnes, ou même un. Le fichier MAT contenant une variable cmap avec une telle matrice, peut être utilisé par colormap, cela n'a pas de sens de demander une liste de "toutes" les cartes de couleurs.

Vous pouvez utiliser exist (c.-à exist('parula', 'file')), ou try clauses, pour vérifier l'existence de certaines fonctions et leur offrir comme colormaps dans votre interface graphique, si cela peut être problématique si l'utilisateur dispose de fonctions personnalisées avec le même nom qui ne donnent pas de colormaps.

J'ai des utilisateurs qui aiment faire des cartes de couleurs totalement personnalisées, qu'ils enregistrent dans des fichiers MAT, donc pour eux, je ferais de la colormap un champ de texte personnalisable, et je ferais une validation pour que ce soit une carte de couleurs valide.

+0

une liste de toutes les cartes de couleurs incluses par défaut dans MATLAB, pas une liste de toutes les cartes de couleurs possibles, il vous manque le point –