web-dev-qa-db-fra.com

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

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

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

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

J'espère que cela a du sens.

40
Josh

En vous basant sur la réponse de @ gnovice, vous pouvez créer des tracés pleins avec des ombres uniquement dans la zone située entre les deux courbes. Utilisez simplement 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 sortez, descendez, puis remontez pour fermer les deux tableaux dans un polygone complet comportant de nombreux côtés.

53
Doresoom

Personnellement, je trouve cela à la fois élégant et pratique d’envelopper la fonction de remplissage. Pour remplir entre deux vecteurs de rangée de taille égale Y1 et Y2 qui partage le support X (et la couleur C):

fill_between_lines = @(X,Y1,Y2,C) fill( [X fliplr(X)],  [Y1 fliplr(Y2)], C );
13
user609961

Vous pouvez accomplir cela en utilisant la fonction REMPLISSEZ pour créer des polygones remplis sous les sections de vos parcelles. Vous voudrez tracer les lignes et les polygones dans l'ordre dans lequel vous souhaitez les empiler à l'écran, en commençant par le plus bas. Voici un exemple avec des 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 chiffre obtenu:

enter image description here

Vous pouvez également modifier l’ordre d’empilement des objets de la figure après les avoir 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'empilement 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 souhaitez empiler vos polygones à l’avance (c’est-à-dire que l’un ou l’autre pourrait être le polygone le plus petit, que vous voulez probablement en haut), vous pouvez alors ajuster le 'FaceAlpha' propriété pour qu'un ou les deux polygones apparaissent partiellement transparents et que l’autre soit en dessous. Par exemple, ce qui suit rendra le polygone vert partiellement transparent:

set(h2,'FaceAlpha',0.5);
11
gnovice

Vous voulez regarder la fonction patch (), et insérer des 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 souhaitez que la zone renseignée ne concerne qu'une partie des données, vous devez tronquer les vecteurs x et y pour inclure uniquement les points dont vous avez besoin.

4
Alex