Stephen Few最近推出了Bandlines ,它是 Edward Tufte 的Sparklines的扩展。有没有一种简单的方法可以使用 ggplot2 生成这些类型的图?
问问题
586 次
1 回答
10
由于这是本月推出的,我怀疑是否已经实施。但是这个概念看起来很简单,你可以很容易地制作一个。这是一个使用图形的非常简单的实现base
(我不是专家ggplot2
)。
bandline<-function(x, low.col, high.col, axis=TRUE){
l <- max(unlist(lapply(x, length)), na.r=TRUE)
r <- range(unlist(x), na.rm=TRUE)
par(mfcol=c(length(x), 1))
for(i in 1:length(x)){
y <- boxplot.stats(x[[i]])
ifelse(i==1, par(mar=c(0,3,3,3)),
ifelse(i==length(x), par(mar=c(3,3,0,3)),
par(mar=c(0,3,0,3))))
plot(NA, axes=F, bty="n", xlim=c(1,l), ylim=r, xaxs="i")
rect(1,y$stats[2], l, y$stats[1], col="grey80", border=NA)
rect(1,y$stats[4], l, y$stats[2], col="grey60", border=NA)
rect(1,y$stats[5], l, y$stats[4], col="grey40", border=NA)
abline(h=y$stats[3],col="white", lwd=2)
lines(seq_along(x[[i]]), x[[i]])
zhigh <- zlow <- x[[i]]
zhigh[zhigh<=y$stats[5]]<-NA
zlow[zlow>=y$stats[1]]<-NA
points(seq_along(x[[i]]), zlow, bg=low.col, pch=21,cex=2)
points(seq_along(x[[i]]), zhigh, bg=high.col, pch=21, cex=2)
if(axis==TRUE){
axis(2, at=pretty(x[[i]]), las=2)
ifelse(i==1, axis(3, at=seq_len(l)),
ifelse(i==length(x),axis(1, at=seq_len(l)),""))
}
mtext(names(x)[i], side=4, srt=270, line=1)
}
}
这是一个例子:
set.seed(1)
dat<-list(a=rnorm(100), b=rnorm(100), c=rnorm(100), d=rnorm(100))
bandline(dat, "black", "white", axis=FALSE)
于 2013-01-29T09:33:07.727 回答