2016-12-21 2 views
1

est en dessous du code qui génère un chiffre qui a une colorbar avec une étiquette personnalisée:colormap de colorbar pas mise à jour lorsque également l'ajout d'une étiquette à la barre

function q41269479 
% Create an axes: 
figure(); 
% Display an image: 
hIm = imagesc(peaks); 
% Adjust colormap and colorbar: 
h = colorbar; colormap(gray); 
ylabel(h, '\Delta', 'Rotation', 0, 'Units', 'Normalized', 'Position', [0.48 1.05]); 

Ce que je attendre à obtenir: Expected result

ce que je réellement obtenir: enter image description here

Notez que le colorbar est toujours parula (la valeur par défaut) et non gray comme je l'ai demandé poliment à être. La manière naturelle de résoudre un problème graphique de ce type est "d'invalider" la figure ... Malheureusement, les commandes populaires drawnow et refresh, exécutées après que la figure soit à l'état montré, ne remédient pas à cette situation.

Il convient de noter que l'exportation de la figure donne les couleurs correctes.

Question: Est-ce que quelqu'un a une idée pourquoi cela se produit et comment le réparer (de préférence sans contournement/hacks)?

Je cours R2016b, sur Win 7. Autant que je sache, ceci ne se produit pas sur Octave 4.0.3.

+0

Cela semble être fixé dans la pré-libération R2017a. – excaza

Répondre

3

Plusieurs solutions de contournement semblent résoudre ce problème:

% Solution 1: adding a pause/drawnow AFTER setting the colormap. 
h = colorbar; colormap(gray); pause(eps); 
% OR: 
h = colorbar; colormap(gray); drawnow; 

% Solution 2: change the figure size (e.g. maximize then minimize) 
drawnow % Required to avoid Java errors 
jFig = get(handle(gcf), 'JavaFrame'); 
jFig.setMaximized(true); pause(0.0001); jFig.setMaximized(false); 

% Solution 3: add/remove datatip 
hDataCursorMgr = datacursormode(gcf); 
hDatatip = createDatatip(hDataCursorMgr,hIm); delete(hDatatip); 

Je ne sais pas pourquoi cela se produit cependant. Ma meilleure estimation est que JIT essaie d'exécuter ces commandes sur plusieurs threads. Puis, lorsque colormap essaie de changer les couleurs du colorbar, il rencontre un objet "verrouillé" par ylabel, et par conséquent ne peut pas remplir sa fonction. Cependant, la mise à jour "directive" fait faire son chemin dans une file d'attente d'événements qui s'exécutent quand certaines choses arrivent à la figure.