以非常紧凑的形式表示时间序列数据
数据挖掘
r
可视化
ggplot2
2021-09-19 17:49:23
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)
其它你可能感兴趣的问题