2017-10-05 8 views
1

Je cherche un moyen d'ombrer l'arrière-plan de mon intrigue semilog en deux couleurs.
Par exemple, dans l'image suivante, j'ai tracé trois polynômes et ils sont tous égaux à x = 1. Je veux un rectangle pour x < 1 région et un autre pour x> 1 région. Comment puis-je insérer deux de ces rectangles, de couleurs différentes, en arrière-plan pour mettre en évidence ces deux régions.Comment définir l'arrière-plan dans plusieurs couleurs dans le graphique semilogy (MATLAB)?

MWE:

x = 0.1:0.1:10; 
    y1 = polyval([1, 0], x);  % Evaluate y = x; 
    y2 = polyval([1, 0, 0], x); % Evaluate y = x^2; 
    y3 = polyval([1, 0, 0, 0], x); % Evaluate y = x^3;  
    figure 
    semilogy(x, y1, '.k', x, y2, '.b', x, y3, '.r'); title ('Three 
    polynomials on a semilog y scale') xlabel('x'); ylabel('y'); 
    legend({'y= x', 'y = x^2', 'y = x^3'}, 'Location', 'Northwest') 

enter image description here

+0

Cochez cette case: [Fond transparent pour l'identification de 0 et 1 dans une figure MATLAB] (https://stackoverflow.com/questions/46527808/transparent-background-for-identification-of-0-and-1- in-a-matlab-figure) et [Mettez en évidence les parties de l'intrigue matlab] (https://stackoverflow.com/questions/13734086/highlight-parts-of-matlab-plot) –

+0

@SardarUsama Désolé, j'ai tapé la réponse avant de voir votre commentaire. En effet, je suis le même chemin à parcourir, mais quand je cherchais, ce n'était rien avec la zone * logscale *. – Guto

Répondre

1

Vous pouvez résoudre que l'utilisation area ou patch.

Comme indiqué par @SardarUsama, il y a othersquestions avec de bons exemples à ce sujet, cependant, vous devez éviter d'avoir des zéros dans les area données, sinon elle échouera.

Suit le code de réglage d'une seule zone.

x = 0.1:0.1:10; 
y1 = polyval([1, 0], x);  % Evaluate y = x; 
y2 = polyval([1, 0, 0], x); % Evaluate y = x^2; 
y3 = polyval([1, 0, 0, 0], x); % Evaluate y = x^3;  
figure 
plot(x, y1, '.k', x, y2, '.b', x, y3, '.r'); %MODIFIED 
hold on %ADDED 
title ('Three polynomials on a semilog y scale') 
set (gca, 'Yscale', 'log'); %ADDED 
xlabel('x'); 
ylabel('y'); 
legend({'y= x', 'y = x^2', 'y = x^3'}, 'Location', 'Northwest') 

area([1 1 10 10],[1e-3 1e+3 1e+3 1e-3 ],'FaceColor','green','facealpha',0.3) %ADDED 

Le code ci-dessus fonctionne pour matlab après 2014b. Si vous avez un avant cela, vous pouvez utiliser la fonction patch (qui nécessite un petit changement dans les données, mais utilise l'option Facealpha) ou vous pouvez déplacer la zone à l'arrière-plan que je fais ci-dessous:

ax=get(gca,'Children'); %ADDED 
set(gca,'Children',[ax(2) ax(3) ax(4) ax(1)]); %ADDED, move area to background 

Note: En effet, j'ai raté le problème avec la légende. Je corrige comme mentionné, mais pour moi la zone était au dessus des autres graphiques. Pour le résoudre j'ai changé l'ordre des parcelles. Si la zone était avec la transparence, ce ne sera pas un problème.

+0

Merci. Cela semble fonctionner, sauf que les deux premières entrées de la légende apparaissent sous forme de rectangles au lieu de lignes. – NAASI

+0

@Guto utilise 'area' lorsque vous avez fini de tracer et avec la propriété' FaceAlpha'. c'est à dire 'Area ([1,1,10,10], [1e-3,1e + 3,1e + 3,1e-3], 'FaceColor', 'vert', 'FaceAlpha', 0,3)' –

+0

@ SardarUsama Merci, j'utilise 2014b, donc ça ne fonctionne pas le 'facealpha'. J'ai édité la question en considérant les deux solutions. – Guto