Sé que esta pregunta puede ser un cliché, pero estoy teniendo dificultades para hacerlo.
Tengo el conjunto de datos en el siguiente formato:
Visitas de fecha 01/11/2010 696537 2/11/2010 718748 3/11/2010 799355 11/4/2010 805800 05/11/2010 701262 6/11/2010 531579 7/11/2010 690068 8/11/2010 756947 9/11/2010 718757 10/11/2010 701768 11/11/2010 820113 11/12/2010 645259
Quiero crear un gráfico de series de tiempo, con eje x que representa vists de tiempo y eje y. Además, quiero marcar el eje x con la fecha. El código que estaba usando es el siguiente:
dm$newday = as.POSIXct(strptime(dm$Day, format="%Y-%m-%d")) plot(as.Date(dm$day),dm$visits) axis.Date(1,Day,at=seq(as.Date("2010/10/30"), as.Date("2011/01/29"),by="days"))
1) Como los tiempos son fechas, asegúrese de usar la clase "Date"
, no "POSIXct"
o "POSIXlt"
. Consulte R News 4/1 para obtener consejos e intente esto donde Lines
se define en la Nota al final. No se usan paquetes aquí.
dm <- read.table(text = Lines, header = TRUE) dm$Date <- as.Date(dm$Date, "%m/%d/%Y") plot(Visits ~ Date, dm, xaxt = "n", type = "l") axis(1, dm$Date, format(dm$Date, "%b %d"), cex.axis = .7)
El uso de text = Lines
es solo para mantener el ejemplo autocontenido y en realidad sería reemplazado por algo como "myfile.dat"
. (continúa después de la imagen)
2) Dado que se trata de una serie temporal, es posible que desee utilizar una representación de serie temporal que proporcione un código ligeramente más simple:
library(zoo) z <- read.zoo(text = Lines, header = TRUE, format = "%m/%d/%Y") plot(z, xaxt = "n") axis(1, dm$Date, format(dm$Date, "%b %d"), cex.axis = .7)
Dependiendo de cómo quiera que se vea la ttwig, puede ser suficiente utilizar el plot(Visits ~ Date, dm)
en el primer caso o el plot(z)
en el segundo caso, suprimiendo por completo el comando del axis
.
Nota:
Lines <- "Date Visits 11/1/2010 696537 11/2/2010 718748 11/3/2010 799355 11/4/2010 805800 11/5/2010 701262 11/6/2010 531579 11/7/2010 690068 11/8/2010 756947 11/9/2010 718757 11/10/2010 701768 11/11/2010 820113 11/12/2010 645259"
Me gusta usar ggplot2
para este tipo de cosas:
df$Date <- as.Date( df$Date, '%m/%d/%Y') require(ggplot2) ggplot( data = df, aes( Date, Visits )) + geom_line()
Tu código tiene muchos errores.
dm$Day
y dm$day
. Probablemente no es lo mismo Date
y Visits
. Entonces tendrías acceso a ellos (supongo) como dm$Date
y dm$Visits
%Y-%m-%d
esto debe ser %m/%d/%Y
El siguiente código debe trazar lo que desea:
dm$newday = as.Date(dm$Date, "%m/%d/%Y") plot(dm$newday, dm$Visits)
Puede rotar las fechas pirateando las notaciones de los ejes con texto ()
Lines <- "Date Visits 11/1/2010 696537 11/2/2010 718748 11/3/2010 799355 11/4/2010 805800 11/5/2010 701262 11/6/2010 531579 11/7/2010 690068 11/8/2010 756947 11/9/2010 718757 11/10/2010 701768 11/11/2010 820113 11/12/2010 645259" dm <- read.table(textConnection(Lines), header = TRUE) dm$Date <- as.Date(dm$Date, "%m/%d/%Y") plot(Visits ~ Date, dm, xaxt = "n", type = "l") axis(1,at=NULL, labels=F) text(x = dm$Date, par("usr")[3]*.97, labels = paste(dm$Date,' '), srt = 45, pos = 1, xpd = TRUE,cex=.7)
Es posible en ggplot y puedes usar scale_date para esta tarea
library(ggplot2) Lines <- "Date Visits 11/1/2010 696537 11/2/2010 718748 11/3/2010 799355 11/4/2010 805800 11/5/2010 701262 11/6/2010 531579 11/7/2010 690068 11/8/2010 756947 11/9/2010 718757 11/10/2010 701768 11/11/2010 820113 11/12/2010 645259" dm <- read.table(textConnection(Lines), header = TRUE) dm <- mutate(dm, Date = as.Date(dm$Date, "%m/%d/%Y")) ggplot(data = dm, aes(Date, Visits)) + geom_line() + scale_x_date(format = "%b %d", major = "1 day")
Me gusta ggplot
también.
Aquí hay un ejemplo:
df1 = data.frame( date_id = c('2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04'), nation = c('China', 'USA', 'China', 'USA'), value = c(4.0, 5.0, 6.0, 5.5)) ggplot(df1, aes(date_id, value, group=nation, colour=nation))+geom_line()+xlab(label='dates')+ylab(label='value')