2010-01-10 37 views
7

que tienen datos como estos:trazado de datos en el eje de tiempo (fecha) en Matlab

22.10.1980. 100 
25.10.1980. 120 
26.10.1980. 12 

(solamente mucho más de lo mismo, y para cada fecha, varias mediciones independientes de la derecha).

Ahora, esto es probablemente trivial, pero nunca he hecho algo así en matlab, y tengo problemas para encontrar ejemplos similares en línea. Necesito trazar los datos en una hora/mostrando el eje de fechas (eje x), con todas las fechas dentro (entonces, 23. y 24. también ... para las cuales no tengo mediciones).

No estoy pidiendo a alguien que resuelva esto por mí, pero si pudiera indicar de qué manera debería ser el mejor para tomar. Nunca había usado este tipo de tipo de datos hasta el momento, así que tengo problemas para encontrar una forma de cargar las fechas para los principiantes.

Respuesta

16

Parece que podría ser el mejor para usar datetick.

+3

1: agradable encontrar. No sabía acerca de esa función. – gnovice

+1

Esto no está actualizado. Ahora se debe utilizar de fecha y hora http://www.mathworks.com/help/matlab/matlab_prog/plot-dates-and-durations.html – hyprfrcb

1

Puede usar datenum para convertir las fechas en números y trazar los datos como de costumbre. Digamos que pones tu vector de fechas en la variable llamada x. Ahora, puede utilizar

set(gca, 'xtick',x(1:10:end)); 
set(gca, 'xticklabel',datestr(x(1:10:end)); 

para fijar las marcas en el eje x.

4

Suponiendo que el archivo de datos tiene el formato indicado anteriormente, se puede usar TEXTSCAN para leer los datos:

fid = fopen('data.txt','rt'); 
C = textscan(fid,'%s %s %s %d','Delimiter','.','CollectOutput',1); 
fclose(fid); 

La primera celda de C contendrá una serie de células N-por-3 de cuerdas (las partes de la fecha) y la segunda celda de C contendrá un vector N-by-1 de las mediciones de datos. Se puede crear un número de fecha para cada medición mediante la concatenación primero las 3 cadenas más pequeñas en una cadena de fecha y luego usando la función DATENUM:

t = datenum(strcat(C{1}(:,3),'-',C{1}(:,2),'-',C{1}(:,1))); 
data = C{2}; 

Una vez que tenga un vector de números de fecha t para ir con su vector de mediciones data, a continuación, puede trazarlos:

plot(t,data,'*'); %# Plot the points as asterisks 

Ahora, puede cambiar las etiquetas del eje x para mostrar las fechas reales. Una opción es usar la función DATETICK, una solución fácil y elegante dada en steven's answer. Otra opción es utilizar la función DATESTR para crear las etiquetas usted mismo, a continuación, modificar los XTick y XTickLabel propiedades de los ejes actuales:

xpts = min(t):max(t); %# Make a full vector, filling in missing dates 
set(gca,'XTick',xpts,'XTickLabel',datestr(xpts)); %# Set axes properties 

NOTA: Sea cual sea la opción que elija para cambiar el eje x etiquetas para fechar cadenas, puede tener problemas con las etiquetas solapándose entre sí si las marcas están demasiado juntas. Puede solucionar esto reduciendo o reposicionando las marcas a lo largo del eje x (cambiando la propiedad XTick) o ajustando la propiedad de los ejes FontSize. Si desea rotar las etiquetas para que quepan, deberá borrar las etiquetas y crear una nueva rotativa text objects para ellas.La siguiente presentación en The MathWorks File Exchange hace precisamente eso:

2

Datetick es una buena opción, así como datetick2, que se puede encontrar aquí: MATLAB Central

Datetick2 permite la panorámica y zoom, con ajustes en las etiquetas de tiempo, dependiendo de lo lejos que está el zoom

no estoy seguro sobre el formato dd.mm.aaaa. - podrías usar regexp o strrep para cambiar los decimales a guiones si es necesario.

3

Con datenum puede convertir cualquier fecha de cadena en formato numérico basado en los símbolos de formato de fecha (ver ayuda datestr).

Por ejemplo Todo esto lleva a la misma representación de fecha numérica:

datenum('15/05/2009 21:22','dd/mm/yyyy HH:MM');
datenum('15.05.2009 21:22','dd.mm.yyyy HH:MM');
datenum('21-22 15.05.2009','HH-MM dd.mm.yyyy');
datenum('21-22 05/15.2009','HH-MM mm/dd.yyyy');
...

Lo bueno es que se puede pasar matriz de celdas (salida de TextScan) o matriz de caracteres directamente a datenum y es la salida matriz de fecha numérica.

Cuestiones relacionadas