faceg_wrap与GGally的ggparcoord()

时间:2013-01-31 11:42:46

标签: r ggplot2 facet-wrap

我想从一个数据集中绘制多个平行坐标图。目前,我有一个使用splitl_ply的工作解决方案,可生成4个ggplot2个对象。我想用facet_wrapfacet_grid解决这个问题,以获得更紧凑的布局和单个图例。这可能吗?

使用正常的ggplot2对象(boxplot),facet_wrap工作正常。使用GGally函数ggparcoord(),我收到错误Error in layout_base(data, vars, drop = drop) : At least one layer must contain all variables used for facetting

我做错了什么?

require(GGally)
require(ggplot2)
# Example Data
x <- data.frame(var1=rnorm(40,0,1),
                var2=rnorm(40,0,1),
                var3=rnorm(40,0,1),
                type=factor(rep(c("x", "y"), length.out=40)),
                set=factor(rep(c("A","B","C","D"), each=10))
                )
# this works
p1 <- ggplot(x, aes(x=type, y=var1, group=type)) + geom_boxplot()
p1 <- p1 + facet_wrap(~ set)
p1 
# this does not work
p2 <- ggparcoord(x, columns=1:3, groupColumn=4) 
p2 <- p2 + facet_wrap(~ set)
p2 

任何建议表示赞赏!谢谢!

1 个答案:

答案 0 :(得分:2)

您不能直接使用函数facet_wrap() ggparcoord(),因为此函数仅将数据用作调用此函数时指定的列。通过查看p2的数据元素可以看出。没有名为set的列。

 p2 <- ggparcoord(x, columns=1:3, groupColumn=4)
 head(p2$data)
  type .ID anyMissing variable       value
1    x   1      FALSE     var1  0.95473093
2    y   2      FALSE     var1 -0.05566205
3    x   3      FALSE     var1  2.57548872
4    y   4      FALSE     var1  0.14508261
5    x   5      FALSE     var1 -0.92022584
6    y   6      FALSE     var1 -0.05594902

要获得具有分面的相同类型的绘图,首先,您需要将新列(仅包含与案例数对应的数字)添加到现有数据框,然后重新整形此数据框。

x$ID<-1:40
df.x<-melt(x,id.vars=c("set","ID","type"))

然后使用函数ggplot()geom_line()绘制数据。

ggplot(df.x,aes(x=variable,y=value,colour=type,group=ID))+
   geom_line()+facet_wrap(~set)

enter image description here