facet_grid的背靠背直方图失败

时间:2011-09-28 07:57:51

标签: r ggplot2

我在创建使用ggplot创建的背对背直方图的构面网格时遇到了一些麻烦。

# create data frame with latency values
latc_sorted <- data.frame(  
subject=c(1,1,1,1,1,2,2,2,2,2),
grp=c("K_N","K_I","K_N","K_I","K_N","K_I","K_N","K_I","K_N","K_I"), 
lat=c(22,45,18,55,94,11,67,22,64,44)    
)   

# subset and order data 
x.sub_ki<-subset(latc_sorted, grp=="K_I")
x.sub_kn<-subset(latc_sorted, grp=="K_N")
x.sub_k<-rbind(x.sub_ki,x.sub_kn)
x=x.sub_ki$lat
y=x.sub_kn$lat
nm<-list("x","y")

# make absolute values on x axis
my.abs<-function(x){abs(x)}

# plot back-to-back histogram
hist_K<-qplot(x, geom="histogram", fill="inverted", binwidth=20) +
geom_histogram(data=data.frame(x=y), aes(fill="non-inverted", y=-..count..),
binwidth= 20) + scale_y_continuous(formatter='my.abs') + coord_flip() + 
scale_fill_hue("variable")

hist_K

这个情节很好,但如果我尝试以下操作,我会收到错误: 错误:转换公式包含熔融数据中未找到的变量:x.sub_k $ subject

hist_K_sub<-qplot(x, geom="histogram", fill="inverted", binwidth=20) +
geom_histogram(data=data.frame(x=y), aes(fill="non-inverted", y=-..count..),
binwidth= 20) + scale_y_continuous(formatter='my.abs') + coord_flip() + 
scale_fill_hue("variable")+
facet_grid(x.sub_k$subject ~ .)

hist_K_sub

任何导致此失败的想法?

2 个答案:

答案 0 :(得分:1)

问题在于facet_grid中引用的变量是在传递给各个层的data.frame中查找的。您已创建(隐式和显式)仅包含lat数据但没有subject信息的data.frames。如果您改为使用x.sub_kix.sub_kn,则会将subject变量与lat值相关联。

hist_K_sub <- 
ggplot() +
  geom_histogram(data=x.sub_ki, aes(x=lat, fill="inverted",     y= ..count..), binwidth=20) +
  geom_histogram(data=x.sub_kn, aes(x=lat, fill="not inverted", y=-..count..), binwidth=20) +
  facet_grid(subject ~ .) +
  scale_y_continuous(formatter="my.abs") +
  scale_fill_hue("variable") +
  coord_flip()

hist_K_sub

hist_K_sub

我也从qplot转换为完整的ggplot语法;这表明ki和kn的平行结构更好。

答案 1 :(得分:0)

上面的语法不适用于较新版本的ggplot2,使用 以下是格式化轴:

abs_format <- function() {
function(x) abs(x) 
}

hist_K_sub <- hist_K_sub+ scale_y_continuous(labels=abs_format())