Gráficos bidimensionales (II)

fill

El comando fill rellena áreas del color especificado

En este ejempo, dibujamos una elipse y un polígono de 10 lados inscrito en la elipse. Calculamos el área del polígono con la función polyarea

%elipse
a=2; b=5; 
t=linspace(0, 2*pi, 200);
x=a*cos(t);
y=b*sin(t);
hold on
plot(x,y,'b')
%polígono
t=linspace(0, 2*pi, 11);
x=a*cos(t);
y=b*sin(t);
fill(x,y,'y')
plot(x,y,'ro','markersize',4,'markeredgecolor','r','markerfacecolor','r')
hold off
title('área de un polígono')
disp(['Area = ' num2str(polyarea(x, y))])

Area = 29.3893

El área de la elipse es πab=π·2·5=31.4159

Dibujamos dos funciones y=-x2 e y=-x2+8, que se cortan en los puntos ±2 y rellenamos el área comprendida entre las dos funciones. Para encerrar el área (véase la figura más abajo) especificamos la primera función y=-x2 entre -2 y +2 y la segunda y=-x2+8, entre +2 y -2. Para ello, invertimos el sentido de los vectores x e y mediante la función fliplr. Esta función hace que el último elemento del vector x pasa a ser el primero.

hold on
fplot('x^2',[-3,3])
fplot('-x^2+8',[-3,3])
x=-2:0.05:2;
fill([x,fliplr(x)],[x.^2,fliplr(-x.^2+8)],'c')
hold off
grid on
xlabel('x')
ylabel('y')
title('área')

stem

Se ha analizado una señal periódica y los coeficientes bn (seno) del desarrollo en serie de Fourier tienen la expresión

b n =2 (1) n nπ

Representamos mediante stem la contribución de cada uno de los armónicos (n=1,2,3...) al desarrollo en serie de Fourier de la función.

n=1:11;
bn=(-1).^n*2./(n*pi);
stem(bn)
title('Espectro de frecuencias')
xlabel('n')
ylabel('b_n')
xlim([0 12])

bar

Se han realizado las siguientes observaciones de la velocidad del viento en una estación meteorológica. Medimos el número de horas en las que la velocidad del viento tenía un valor medio comprendido entre 0 y 1 m/s, entre 1 y 2, ... entre 22 y 23.

Velocidad0.51.52.53.54.55.56.57.58.59.510.511.512.513.514.515.516.517.5
Horas631305069756059696143445443211174
Velocidad18.519.520.521.5
Horas2113

Vamos a representar las frecuencias mediante un diagrama de barras.

x=0.5:21.5;
horas=[6,31,30,50,69,75,60,59,69,61,43,44,54,43,21,11,7,4,2,1,1,3];

frec=horas/sum(horas);
bar(frec,'c');
title('Distribución Weibull')
xlabel('Observación')
ylabel('Frecuencia')

Histogramas, hist

El intervalo (a, b) que abarca todos los datos, se divide en subintervalos. El histograma es un diagrama de barras verticales en el que la anchura de cada barra se corresponde con el tamaño del subintervalo y la altura con el número de datos en dicho subintervalo.

Por defecto, MATLAB divide el intervalo (a,b) en 10 subintervalos de la misma anchura.

y=[53,50,93,89,91,80,59,69,56,64,69,63,74,82,84,91,
63,66,48,56,73,73,66,64,74,63,69,58,73,73]; 
hist(y)
xlabel('T')
ylabel('n')
title('Temperaturas')

>> min(y)
ans =    48
>> max(y)
ans =    93

El valor mínimo del vector y es 48 y el valor máximo es 93, la diferencia es de 45, por lo que el tamaño de cada subintervalo es 4.5. El primer subintervalo va de 48 a 52.5 está centrado en 50.25 y contiene dos datos. El segundo subintervalo va de 52.5 a 57, está centrado en 54.75 y contiene tres datos. Dos subintervalos: (75 a 79.5) y (84 a 88.5) no contienen datos

>> [N,X]=hist(y)
N =     2     3     2     7     3     6     0     3     0     4
X =   50.2500   54.7500   59.2500   63.7500   68.2500   72.7500   77.2500   
81.7500   86.2500   90.7500

La función hist, devuelve el número de datos N en cada subintervalo y el centro X de cada uno de ellos

La función randn devuelve números aleatorios comprendidos entre 0 y 1 tomados de una distribución normal, cuyo valor medio es x0 y cuya desviación estándar es sigma. Se compara el diagrama de barras con la representación gráfica de la función de distribución

x0=1; % valor medio
sigma=0.5; % desviación estándar
xp=x0+sigma*randn(1,10000); %vector de N números aleatorios
hold on
[n,xs]=hist(xp, 25); 
bar(xs, n); 
xlabel('Valores')
ylabel('Número de datos')
f=@(x) max(n)*exp( -(x-x0).^2/(2*sigma^2));
fplot(f,[-0.5,2.5],'r')
hold off

Es posible cambiar el valor por defecto. Se le puede suministrar a la función hist un vector x, cuyos valores son los centros de cada uno de los subintervalos tal como vemos en la figura, los subintervalos pueden tener distinta anchura.

Se miden las temperaturas a lo largo de un periodo de 30 días en una ciudad. La temperatura mínima es a=5 grados y la máxima b=35 grados. Dividimos el intervalo en tres subintervalos centrados en 10, 20 y 30 grados que nos indican el número de días con temperatura fría, templada y cálida.

Las temperaturas se generan de forma aleatoria mediante la función rand

a=5; %temperatura mínima
b=35; %temperatura máxima
T=round(a+(b-a)*rand(30,1)); %30 temperaturas al azar
x=a+5:10:b;
hist(T,x)
hg=findobj(gca,'Type','patch'); %color
set(hg,'FaceColor','c','EdgeColor','k')
xlabel('Temperatura')
ylabel('n. de días')
title('Temperatura en una ciudad')

semilog, loglog

Son útiles cuando hacemos representaciones gráficas de funciones exponenciales o potenciales. Representamos la función 10·exp(-2·x) utilizando el comando semilogy.

x=linspace(0,3);
y=10*exp(-2*x);
semilogy(x,y)
grid on

Representamos la siguiente función en un diagrama doblemente logarítmico

y = ( ( a x ) c + b c ) 1 / c

con a=24, b=0.32 y c=0.52

a=24;
b=0.32;
c=0.52;
f=@(x) ((a./x).^c+b^c).^(1/c);

x=logspace(-2,6,100);
loglog(x,f(x))
grid on
xlabel('x')
ylabel('y')
title('loglog') 

polar

polar

Las coordenadas polares especifican un punto en términos de la distancia (radio) al origen r y el ángulo θ que forma con el eje X.

La espiral logarítmica es una de las curvas notables junto a la catenaria, la cicloide, etc. La ecuación de la espiral logarítmica en coordenadas polares es

r=r0·exp(b·θ)

Donde r0 es el radio inicial, b es un parámetro, y θ es el ángulo en radianes.

r0=0.4; 
b=0.05; 
ang=0:pi/18:9*pi/2;
r=r0*exp(b*ang);
polar(ang,r,'r')
title('Espiral logarítmica')

Utilizando la función pol2cart, que convierte coordendas polares a coordenadas rectangulares, obtenemos un resultado similar mediante el comando plot en vez del comando polar

r0=0.4;
b=0.05;
ang=0:pi/18:9*pi/2;
r=r0*exp(b*ang);
[x,y]=pol2cart(ang,r);
plot(x,y,'r')
axis equal
title('Espiral logarítmica')
grid on

En Internet se pueden encontrar las ecuaciones de curvas polares como las cardiodes

r=b+a·cosθ
r=b+a·sinθ

en los siguientes casos: b<a, a<b<2a, 2ab. El primero es el más interesante.

Otra curva es la denominada pétalos de una rosa

r=a·cos()

donde n es el número entero: 2, 3, 4, 6...

La lemniscata de Bernoulli

r2=2a2cos(2θ)

Manejadores de los gráficos

Siempre que MATLAB crea un gráfico, crea un manejador (handle) para este gráfico. Vamos a ver mediante ejemplos como se pueden cambiar las propiedades del gráfico mediante manejadores.

La función plot devuelve el manejador del gráfico actual, mediante la función set se pueden cambiar sus propiedades.

>> x=0:pi/30:2*pi;
>> hg=plot(x,sin(x));
>> set(hg,'color','r','linewidth',3)

El gráfico que inicialmente tenía color azul (por defecto) cambia a color rojo. La anchura de línea cambia a tres.

gca es una referencia (handle) que identifica los ejes de la gráfica y a través de este manejador podemos cambiar el aspecto de los ejes. xTick es la propiedad (división del eje horizontal) y a continuación, se pone el nuevo valor de dicha propiedad 0:pi/2:2*pi.

x = 0:.02:2*pi;
y = cos(x);
plot(x,y)
set(gca,'XTick',0:pi/2:2*pi)
set(gca,'XTickLabel',{'0','\pi/2','\pi','3\pi/2','2\pi'})
set(gca,'YTick',-1:0.25:1)

De esta forma, podemos cambiar las divisiones por defecto de los ejes X e Y.

En este ejemplo, las divisiones XTick del eje X tienen un nombre XTickLabel muy largo y es necesario girarlas XTickLabelRotation, para que sean legibles

x=1:6;
y=[13,5,7,14,10,2];
plot(x,y,'o',x,y)
set(gca,'XTick',x);
set(gca,'XTickLabel',{'Julio','Agosto','Septiembre','Octubre',
'Noviembre','Diciembre'}, 'XTickLabelRotation',15)
xlabel('Mes')
ylabel('Ventas')
title('Ventas mensuales')

Combinando ejes lineales y logarítmicos

Podemos utilizar plotyy para comparar dos gráficas que tinene distintas escalas

a=1000;b=0.005;
t=0:900;
y1=a*exp(-b*t);
y2=sin(b*t);
[ha,h1,h2] = plotyy(t,y1,t,y2,'semilogy','plot');
axes(ha(1)) %eje de la izquierda
ylabel('Semilogarítmico')
axes(ha(2)) %eje de la derecha
ylabel('Lineal')
set(h2,'linewidth',1.5) %gráfica 2

Dibujamos la primera función y1 a escala semilogarítmica y la segunda función y2 a escala normal. El comando plotyy devuelve una referencia (handle) a los ejes en ha, una referencia al primer gráfico en h1 y una referencia al segundo en h2. Como hay dos ejes ha es un vector de dos elementos, ha(1) es una referencia al eje izquierdo y ha(2) al eje derecho. Modificamos la anchura de línea del segundo gráfico h2 con la función set.

Edición en la ventana de los gráficos

Escribimos en la ventana de comandos

>> x=0:pi/40:2*pi;
>> plot(x,cos(x))

En la ventana de los gráficos (Figure Window) podemos cambiar las propiedades de un gráfico. Seleccionamos Tools->Edit Plot

Se selecciona el gráfico con el cursor, aparecen cuadrados de color negro (handles), se pulsa el botón derecho del ratón estando el gráfico seleccionado, aparece el menú de la figura, que nos permite cambiar varias propiedades del gráfico: color, anchura y estilo de línea, marcador, etc.

Se puede utilizar el menú Insert para establecer las etiquetas de los ejes (xlabel, ylabel), el título (title), legend, etc. Dibujar líneas, elipses, rectángulos, insertar textos, etc.

Seleccionando Show Property Editor, o bien, en el menú View->Property Editor o en el menú Edit->(Figure Properties, Axes properties, Current Object Properties, Colormap) aparece una ventana que nos permite cambiar las propiedades del gráfico de forma interactiva. Pulsamos en el botón More properties... aparece una tabla (Inspector) de propiedades del objeto seleccionado que podemos modificar.

La edición interactiva en la ventana de los gráficos, nos permite prepararlos para presentaciones, pero escasamente se utilizará en los cálculos, por lo que queda al lector la tarea de explorar sus numerosas opciones, consultando el extenso documento MATLAB Graphics

Ejemplos en el curso de Física

plot

La mayor parte de las porciones de código MATLAB, terminan con una representación gráfica, por lo que la lista de páginas en las que se utiliza el comando plot es demasiado numerosa para mencionarlas en este apartado.

fplot

Se dispara un proyectil contra un blanco móvil

Movimiento sobre una superficie semicircular cóncava

Movimiento sobre una superficie cóncava en forma de cicloide

Un modelo de colisiones inelásticas

polar

El disco compacto CD

Interferencia de ondas producidas por varias fuentes

Medidas de la velocidad y dirección del viento

pie

Choques en una dimensión

Choques en dos dimensiones

stem

El columpio

Análisis armónico de las mareas

Análisis de Fourier de los desplazamiento de las olas

bar, barh

Movimiento de caída de los cuerpos

Macroestado, microestados. Temperatura, entropía

Niveles discretos de energía

Datos de las olas del mar

Análisis de las alturas y periodos de las olas

Medidas de la velocidad y dirección del viento

Función de distribución de Weibull

quiver

Movimiento curvilíneo

fill

Apuntar un cañón para dar en el blanco

Alcance máximo en un plano inclinado

Respuesta de un oscilador a una fuerza impulsiva (I)

El arco iris

La ecuación de van der Waals

Distribución de la energía entre las moléculas de un gas ideal

Enfriamiento de un gas

El pozo de potencial

Sistema de pozos de potencial

Potencial periódico. Modelo de Kronig-Penney

El oscilador armónico cuántico

Barreras de potencial

El espejo esférico y el espejo parabólico (I)

El espejo parabólico (II)

Análisis de las alturas y periodos de las olas

Función de distribución de Weibull

Función de distribución de Rayleigh

subplot

Un bloque desliza a lo largo de un plano inclinado y deforma un muelle

Medida de la velocidad de una bala

Un depósito de arena que se mueve sobre una pista horizontal

Solución numérica de las ecuaciones del movimiento

Movimiento Armónico Simple

El columpio

Movimiento de una caja sobre una cinta transportadora

Interferencia de ondas producidas por varias fuentes

Transformada de Fourier

Cohete propulsado por agua

Análisis de Fourier de los desplazamiento de las olas