以非常紧凑的形式表示时间序列数据

数据挖掘 r 可视化 ggplot2
2021-09-19 17:49:23

我将一个月的时间序列数据按天绘制为 在此处输入图像描述

注意每天都遵循不同的模式现在,我想在一篇研究论文中以非常紧凑的形式展示每天的这种“模式多样性”。使用 R 以紧凑形式表示它的不同方式/选项是什么?

2个回答

模拟一些数据:

library(ggplot2)
library(purrr)
library(ggthemes)

days <- seq(as.Date("2015-08-01"), as.Date("2015-08-31"), by="1 day")
hours <- sprintf("%02d", 0:23)

map_df(days, function(x) {
  map_df(hours, function(y) {
    data.frame(day=x, hour=y, val=sample(2500, 1), stringsAsFactors=FALSE)
  })
}) -> df

核实:

ggplot(df, aes(x=hour, y=val, group=day)) +
  geom_line() +
  facet_wrap(~day) +
  theme_tufte(base_family="Helvetica") +
  labs(x=NULL, y=NULL)

在此处输入图像描述

由于您只是想传达变化的范围,也许使用几天内小时值的箱线图?

ggplot(df, aes(x=hour, y=val)) +
  geom_boxplot(fill="#2b2b2b", alpha=0.25, width=0.75, size=0.25) +
  scale_x_discrete(expand=c(0,0)) +
  scale_y_continuous(expand=c(0,0)) +
  coord_flip() +
  theme_tufte(base_family="Helvetica") +
  theme(axis.ticks=element_blank()) +
  labs(x=NULL, y=NULL)

在此处输入图像描述

可以对其进行调整以适应大多数出版物图形插槽,并且箱线图显示了每天的读数有多么不同。

您还可以使用boxplot.stats来获取汇总数据并将其绘制在折线图上:

library(dplyr)
library(tidyr)

bps <- function(x) {
  cnf <- boxplot.stats(x)$conf
  data.frame(as.list(set_names(cnf, c("lwr", "upr"))), mean=mean(x))
}

group_by(df, hour) %>% 
  do(bps(.$val)) %>% 
  ggplot(aes(x=hour, y=mean, ymin=lwr, ymax=upr, group=1)) +
  geom_ribbon(fill="#2b2b2b", alpha=0.25) +
  geom_line(size=0.25) +
  theme_tufte(base_family="Helvetica") +
  theme(axis.ticks=element_blank()) +
  labs(x=NULL, y=NULL)

在此处输入图像描述

两种替代方法是每小时的密度图和小时和分解值的水平图

我正在显示具有两种不同的统一分布(白天和黑夜时间)的 ganarated 数据

密度图

library(lattice)
xy <- densityplot(~ value,  groups = hour ,   
plot.points=FALSE, 
data =  df,   
scales=list(x=list(rot=90, cex= .9 ),y=list(cex=.9)),par.strip.text=list(cex=.8),   
ylab="density", xlab="value", main=paste(  "DensityPlot"  ) )
print (xy)

在此处输入图像描述

水平图

library(RColorBrewer)
xy <- levelplot(cnt ~    hour + value,   
 col.regions=colorRampPalette(brewer.pal(9,"YlOrRd"))(16) ,
data =  df,   
scales=list(x=list(rot=90, cex= .9 ),y=list(cex=.9)),par.strip.text=list(cex=.8),   
ylab="value", xlab="hour", main=paste( "LevelPlot"  ) )
print (xy)

在此处输入图像描述