2011-06-05 9 views
36

Tengo una pregunta sobre el uso de la función area; o tal vez otra función está en orden ... creé esta trama desde un archivo de texto grande:MATLAB, rellenando el área entre dos conjuntos de datos, líneas en una figura

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

El verde y el azul representan dos archivos diferentes. Lo que quiero hacer es rellenar el área entre la línea roja y cada carrera, respectivamente. Puedo crear un diagrama de área con una idea similar, pero cuando los represento en la misma figura, no se superponen correctamente. Esencialmente, 4 parcelas estarían en una figura.

Espero que esto tenga sentido.

Respuesta

4

que desea buscar en la función de parche(), y colarse en los puntos de inicio y final de la línea horizontal:

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 sólo desea que el llenado en la zona para una parte de los datos , deberá truncar los vectores xey para incluir solo los puntos que necesita.

+0

Gracias, Voy a mirar en esta función parche de hoy! – Josh

+0

parche() es la versión de nivel inferior de fill() por lo que esta o la respuesta de gnovice deben hacer lo que desee. – Alex

11

Puede hacerlo utilizando la función FILL para crear polígonos rellenos en las secciones de sus trazados. Deberá trazar las líneas y los polígonos en el orden en que desea que se apilen en la pantalla, empezando por el más inferior. He aquí un ejemplo con algunos datos de muestra:

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 

Y aquí está la cifra resultante:

enter image description here

También puede cambiar el orden de apilamiento de los objetos en la figura después de haberlos tramado por modificando el orden de los identificadores en el 'Children' property del objeto de ejes. Por ejemplo, este código se invierte el orden de apilamiento, ocultando el polígono verde detrás del polígono azul:

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

Por último, si usted no sabe exactamente qué orden desea apilar los polígonos antes de tiempo (es decir, cualquiera de los dos podría ser el polígono más pequeño, que probablemente desee en la parte superior), entonces puede ajustar el 'FaceAlpha' property para que uno o ambos polígonos aparezcan parcialmente transparentes y muestren el otro debajo de él. Por ejemplo, la siguiente hará que el polígono verde parcialmente transparente:

set(h2,'FaceAlpha',0.5); 
+0

Esto también parece muy prometedor. No pensé intentar un método como este. Te actualizaré cuando tenga mi intento. – Josh

48

edificio fuera de la respuesta de @ gnovice, en realidad se puede crear parcelas llenas con sombreado sólo en el área entre las dos curvas. Simplemente use fill junto con fliplr.

Ejemplo:

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

Saltando a la matriz y la concatenación de x con el original, que vas a salir, abajo, atrás, y luego hacia arriba para cerrar ambas matrices en una completa , polígono de muchos y muchos lados.

+0

Una sugerencia más sobre fliplr: si sus vectores son nx1 pero debe trazarlos como un 1xn (por la razón que sea), tome el _inside_ principal. es decir, 'yb = [y1 ', fliplr (y2')]'. No 'yb = [y1 ', fliplr (y2)']'. – webelo

+0

¿Podemos hacer que la región sombreada se llene con "+" u otro marcador diferente? – ftxx

+0

@ftxx Claro, si desea poblar el área entre las dos curvas con una matriz, y luego trazarlo con un "+" para un marcador de puntos. – Doresoom

12

Personalmente, me parece elegante y conveniente para envolver la función de relleno.Para llenar entre dos vectores fila de igual tamaño y Y1Y2 que comparten el apoyo X (y color C):

fill_between_lines = @(X,Y1,Y2,C) fill([X fliplr(X)], [Y1 fliplr(Y2)], C); 
Cuestiones relacionadas