Как создавать полосы с помощью ggplot2?

Stephen Few has recently introduced Bandlines which are an extension to Edward Tufte’s Sparklines. Is there an easy way to produce these kinds of plots using ggplot2?

3
nl ja de
Положите немного мяса на эту кость. Как насчет того, чтобы предоставить нам какой-то возможный код, который вы хотели бы ввести, а затем образ макета графического изображения, который вы хотели бы получить. Первый g в ggplot - это грамматика - вы сказали нам, что хотите для второго g , но как насчет первого? PPL, похоже, думает, что ggplot предназначен только для красивой графики с красивыми затененными фонами и разумными цветами, но забывайте о грамматике ...
добавлено автор Spacedman, источник

1 ответы

Поскольку это было введено в этом месяце, я сомневаюсь, что уже есть реализация. Но концепция кажется достаточно простой, что вы можете сделать ее довольно легко. Вот очень простая реализация, использующая графику 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)

enter image description here

10
добавлено
Я был немного саркастичен. Но было бы неплохо показать нам, как может работать гипотетический geom_bandplot . Я не ожидаю кода для функции, всего несколько строк примера R ввода, как вы могли бы назвать это и что вы ожидаете получить. Его всегда хорошая практика, чтобы максимально подробно описать ваши требования.
добавлено автор Spacedman, источник
@Spacedman Неверно. Я понимаю также базовую графику, но мне очень нравится ggplot2, что я хотел бы увидеть, как кто-то покажет мне, как это сделать, используя ggplot2. Я не знаю, как это сделать сам. Я дал +1 за планплан за его реализацию.
добавлено автор jrara, источник
Ну, честно говоря, он не единственный ;-)
добавлено автор SlowLearner, источник