我想从一个数据集中绘制多个平行坐标图。目前,我有一个使用split
和l_ply
的工作解决方案,可生成4个ggplot2
个对象。我想用facet_wrap
或facet_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
任何建议表示赞赏!谢谢!
答案 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)