Как создать график ленты?

Я хочу создать график ленты (на самом деле это линейный график нескольких групп категориальной переменной), но отображаемый в стиле 3d. Это будет выглядеть примерно так:

Ribbon plot example

Так что, возможно, нам захочется построить следующие образцы данных в виде графика ленты:

set.seed(10)
fun <- function(i) data.frame(person=rep(LETTERS[i], 26), 
    letter=letters, count=sample(0:100, 26, T))
dat <- do.call(rbind, lapply(1:10, function(i) fun(i)))

library(ggplot2) #a traditional 2-d line plot of the data
ggplot(data=dat, aes(x=letter, y=count, group=person, color=person)) + 
    geom_line()

Как это можно достичь в R? Я знаю, что могут быть лучшие способы отображения данных, но мой интерес в настоящее время заключается в создании графика в стиле ленты.

Ответ 1

Надеюсь, приведенный ниже пример поможет вам в правильном направлении:

# data
mat <- matrix(dpois(rep(1:20, 10), lambda=rep(10:1, each=20)), ncol=10)

# 2d line plot
matplot(mat, type="l", col="black", lty=1)

# 3d ribbon plots
par(mar = c(0, 1, 0, 1))
par(mfrow=c(1,2))
persp(z=mat[,rep(seq(ncol(mat)), each=2)], r=5, theta=320, phi=35, shade=0.5,
      border=NULL, col=rep(c("#808080FE","#00000000"), each=nrow(mat)-1))
persp(z=mat[,rep(seq(ncol(mat)), each=2)], r=5, theta=320, phi=35, shade=0.5,
      border=NA, col=rep(c("#808080FE","#00000000"), each=nrow(mat)-1))
par(mfrow=c(1,1))
par(mar = c(5,4,4,2)+.1)

ribbon_example

Как вы можете видеть, основная идея здесь довольно проста. Мы упорядочиваем наши значения для построения в матрицу, дублируем столбцы в матрице так, чтобы они находились в парах, а затем построили значения с помощью persp(), следя за тем, чтобы чередовать прозрачные и непрозрачные цвета. Однако есть несколько сложных деталей, которые еще предстоит решить, особенно в отношении того, что делать с параметром границы. Я оставлю эти данные вам.

Надеюсь, что это поможет.