如何创建一个缎带图?

13

我想创建一个缎带图(实际上是多个类别变量组的线性图),但以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个回答

18

希望下面的示例能够帮助您找到正确的方向:

# 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()来绘制这些值,确保在透明和不透明颜色之间交替使用。然而,仍有一些棘手的细节需要解决,特别是有关边框参数的处理。我会留给你来处理这些细节。

希望这能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接