MATLAB, remplir la zone entre deux ensembles de données, lignes dans une figure

j'ai une question sur l'utilisation de l' area fonction; ou peut-être qu'une autre fonction est en ordre... J'ai créé cette parcelle à partir d'un gros fichier texte:

http://img818.imageshack.us/img818/9519/iwantthisareafilledin.jpg

le vert et Le bleu représentent les deux fichiers différents. Ce que je veux faire, c'est remplir la zone entre la ligne rouge et chaque course, respectivement. Je peux créer un graphique de zone avec une idée similaire, mais quand je les tracer sur la même figure, ils ne se chevauchent pas correctement. Essentiellement, 4 parcelles sur un figure.

j'espère que cela a du sens.

39
demandé sur Amro 2011-06-06 00:23:37

4 réponses

en se basant sur la réponse de @gnovice, vous pouvez en fait créer des tracés remplis avec des ombres seulement dans la zone entre les deux courbes. Suffit d'utiliser fill en conjonction avec fliplr.

Exemple:

x=0:0.01:2*pi;                  %#initialize x array
y1=sin(x);                      %#create first curve
y2=sin(x)+.5;                   %#create second curve
X=[x,fliplr(x)];                %#create continuous x value array for plotting
Y=[y1,fliplr(y2)];              %#create y values for out and then back
fill(X,Y,'b');                  %#plot filled area

enter image description here

en retournant le tableau x et en le concaténant avec l'original, vous allez sortir, descendre, revenir, et puis monter pour fermer les deux tableaux dans un polygone complet, à plusieurs côtés.

50
répondu Doresoom 2013-12-19 21:07:06

personnellement, je trouve à la fois élégant et pratique d'envelopper la fonction de remplissage. Pour remplir entre deux vecteurs de ligne de taille égale Y1 et Y2 qui partagent le support X (et la couleur C):

fill_between_lines = @(X,Y1,Y2,C) fill( [X fliplr(X)],  [Y1 fliplr(Y2)], C );
13
répondu user609961 2013-05-17 20:26:09

vous pouvez accomplir ceci en utilisant la fonction FILL pour créer des polygones remplis sous les sections de vos parcelles. Vous souhaitez tracer les lignes et les polygones dans l'ordre que vous voulez être empilés l'un sur l'écran, en commençant par le plus bas. Voici un exemple avec quelques exemples de données:

x = 1:100;             %# X range
y1 = rand(1,100)+1.5;  %# One set of data ranging from 1.5 to 2.5
y2 = rand(1,100)+0.5;  %# Another set of data ranging from 0.5 to 1.5
baseLine = 0.2;        %# Baseline value for filling under the curves
index = 30:70;         %# Indices of points to fill under

plot(x,y1,'b');                              %# Plot the first line
hold on;                                     %# Add to the plot
h1 = fill(x(index([1 1:end end])),...        %# Plot the first filled polygon
          [baseLine y1(index) baseLine],...
          'b','EdgeColor','none');
plot(x,y2,'g');                              %# Plot the second line
h2 = fill(x(index([1 1:end end])),...        %# Plot the second filled polygon
          [baseLine y2(index) baseLine],...
          'g','EdgeColor','none');
plot(x(index),baseLine.*ones(size(index)),'r');  %# Plot the red line

Et voici le résultat:

enter image description here

vous pouvez aussi changer l'ordre d'empilage des objets dans la figure après vous les avez tracés en modifiant l'ordre des poignées dans le 'Children' propriété de l'objet axes. Par exemple, ce code inverse l'ordre d'empilage, en cachant le polygone vert derrière le polygone bleu:

kids = get(gca,'Children');        %# Get the child object handles
set(gca,'Children',flipud(kids));  %# Set them to the reverse order

enfin, si vous ne savez pas exactement dans quel ordre vous voulez empiler vos polygones à l'avance (c'est-à-dire que l'un ou l'autre pourrait être le plus petit polygone, que vous voulez probablement au-dessus), alors vous pouvez ajuster le 'FaceAlpha' propriété de sorte que l'un ou les deux les polygones apparaîtront partiellement transparents et montreront l'autre en dessous. Par exemple, ce qui suit rendra le polygone Vert partiellement transparent:

set(h2,'FaceAlpha',0.5);
11
répondu gnovice 2011-06-06 13:22:29

vous voulez regarder la fonction patch (), et vous faufiler dans les points pour le début et la fin de la ligne horizontale:

x = 0:.1:2*pi;
y = sin(x)+rand(size(x))/2;

x2 = [0 x 2*pi];
y2 = [.1 y .1];
patch(x2, y2, [.8 .8 .1]);

si vous voulez seulement la zone remplie pour une partie des données, vous aurez besoin de tronquer les vecteurs x et y pour inclure seulement les points dont vous avez besoin.

4
répondu Alex 2011-06-05 23:34:50