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