我有一个大约28,000条条目的数据集。它们由下列格式的日期/时间戳组成
02/21/2014 12:11:24 PM我想用数据创建几个图表,以更好地可视化它。如果有人能为我指出正确的方向,如何在一定时期内绘制一个显示条目数量的图表,那就太棒了。这个计划是用图表来确定每小时有多少人在数据集的宇宙中应用(大约3周)。
所以,如果在2/21的11:00到11:59pm之间有4个条目,我希望这个图在y轴上有一个4的值。
如果你觉得有一个更好的平台来做这件事,那将是非常感谢的。
发布于 2016-07-03 04:00:02
对此,R是完美的。有几个包是有用的。下面我展示了一些示例数据和最简单的绘图例程之一。您可能也感兴趣的其他情节可以在ggplot2包中找到。
使用lubridate包可以简化对日期的解析。您首先需要导入数据。由于没有提供示例导入的数据,我最后还提供了一些一般性提示。
install.packages("lubridate")
library(lubridate)生成一些示例数据:
Lubridate有一个类似的函数集合,使用字母m、d、y、h、m和s。您可以按许多不同的顺序排列字母,并且通常在包中有一个函数来解析您的日期。例如,如果您只有一个日期,如2014/02/21,那么您将使用ymd()函数。对于您所描述的数据,您将需要mdy_hms()。导入的数据不需要seq(),但这里需要生成一个示例。
start_date <- mdy_hms("02/21/2014 12:11:24 PM")
end_date <- mdy_hms("02/22/2014 12:11:24 PM")
date.sequence <- seq(start_date,end_date, by = '1 hour')绘图作为直方图并使用频率选项:
这将给出整数,这是y轴上每个bin的计数。没有它,你就有了密度,这意味着整个地块将被标准化,使得整个曲线下的面积等于1。第二个参数叫做bin,你也可以用20或100这样的数字来代替它。28000人可能不会给出一个很好的图表。
hist(date.sequence, length(date.sequence), freq = TRUE)

关于导入数据的增编:
这不是最初的要求,但也可以帮助进口。
从CSV文件导入数据。as.is参数将确保R不使用它的默认方法来解释日期,以便以后可以使用lubridate包。
all.dates <- read.table( "filename.csv", as.is=TRUE )然后,根据您的格式从lubridate中选择适当的函数。例如:
all.dates.reformatted <- mdy_hms(all.dates)发布于 2016-07-03 04:50:06

## generate data
set.seed(1L);
N <- 28e3L;
dts <- sort(as.POSIXct('2014-02-01')+86400L*(sample(7L*3L,N,T,rep(c(1L,2L,rep(10L,5L)),3L))-1L)+rnorm(N,86400/2,86400/8));
## bucket into hours and table
dts.cut <- cut(dts,'hour');
dts.freq <- table(dts.cut);
## precompute plot parameters
xlim <- range(dts); xlim <- as.POSIXct(c(round(xlim[1L]-86400/2,'day'),round(xlim[2L]+86400/2,'day'))); ## must convert back from POSIXlt to POSIXct, otherwise plot() fails on xlim
xticks.day <- seq(xlim[1L],xlim[2L],'day');
xticks.week <- xticks.day[setdiff(which(weekdays(xticks.day)=='Saturday'),c(1L,length(xticks.day)))];
xticks <- rep(xticks.day,each=3L)+1:3*60*60*6;
ylim <- range(dts.freq); ylim <- c(0,(ylim[2L]+9L)%/%10L*10L);
yticks <- seq(0,ylim[2L],10L);
col <- 'red';
## helper function, from <http://stackoverflow.com/questions/29125019/get-margin-line-locations-mgp-in-user-coordinates>
line2user <- function(line,side) {
lh <- par('cin')[2L]*par('cex')*par('lheight');
x1 <- diff(grconvertX(0:1,'inches','user'));
y1 <- diff(grconvertY(0:1,'inches','user'));
switch(side,
`1`=par('usr')[3L]-line*y1*lh,
`2`=par('usr')[1L]-line*x1*lh,
`3`=par('usr')[4L]+line*y1*lh,
`4`=par('usr')[2L]+line*x1*lh,
stop('side must be 1, 2, 3, or 4',call.=FALSE)
);
}; ## end line2user()
## draw plot
par(mar=c(5,4,4,2)+0.1+c(2,0,0,0));
plot(NA,xlim=xlim,ylim=ylim,axes=F,xaxs='i',yaxs='i',ann=F);
abline(v=xticks,col='lightgrey');
segments(xticks.day,ylim[2L],y1=line2user(4,1L),col='darkgrey',lwd=2,xpd=NA);
segments(xticks.week,ylim[2L],y1=line2user(4,1L),col='black',lwd=2,xpd=NA);
abline(h=yticks,col='lightgrey');
abline(h=0);
axis(1L,xticks,format(xticks,'%H:00'),las=2L,cex.axis=0.7);
axis(2L,yticks,las=2L,cex.axis=0.7);
mtext('Time',1L,5,font=3L);
mtext('Frequency',2L,2.75,font=3L);
mtext(format(xticks.day[-length(xticks.day)],'%a %b %d'),1L,2.75,at=xticks.day[-length(xticks.day)]+12*60*60,cex=0.7,font=2L);
x <- as.POSIXct(names(dts.freq));
y <- dts.freq;
lines(x,y,col=col,xpd=NA);
points(x,y,pch=16L,cex=0.7,col=col,xpd=NA);
title(paste0('Events per hour, ',format(xlim[1L],'%Y-%m-%d'),' to ',format(xticks.day[length(xticks.day)-1L],'%Y-%m-%d')));https://stackoverflow.com/questions/38166173
复制相似问题