2016-01-21 72 views
1

考慮這個數據幀:排除在每個方面未使用的因子水平在ggplot

df <- data.frame(vars=c(rnorm(3),rnorm(3,2,1), rnorm(3,1,1)), 
      names=c("a","b","c","a","d","b","c","a","f"), 
      groups=c(rep("x",3),rep("y",3),rep("z",3))) 

我與ggplot繪製這樣的:

ggplot(df, aes(reorder(names, vars), names)) + geom_bar(stat="identity") + 
theme_bw() + facet_grid(groups~., scales="free_x") + coord_flip() +  ylab(NULL) + xlab(NULL) 

它看起來像這樣

enter image description here

我現在想要以下內容:

  • 每個網格物品應丟棄未使用的物品,例如,在「x」網格中不應該有「d」和「f」,x軸應該是「變量」列的值。每個網格中的比例應該是相同的,應該放棄整個x比例。我只是想在每一個網格條完整的比例
  • 酒吧應該是在每個網格遞減順序(頂部長條)

更新:使用從諮詢

編輯here我得到這個錯誤:

ggplot(df, aes(names,vars)) + geom_bar(stat="identity") + coord_flip() + 
    theme_bw() + facet_wrap(~groups,nrow = 3,scales = "free_x") 

Error in facet_render.wrap(plot$facet, panel, plot$coordinates, theme, : 
    ggplot2 does not currently support free scales with a non-cartesian coord or coord_flip. 
In addition: Warning message: 
Stacking not well defined when ymin != 0 

當我刪除coord_flip()它的工作原理,但我仍然得到警告,結果不是我想要的。

+1

您可以檢查[這裏](http://stats.stackexchange.com/questions/24806/dropping-unused-levels-in-facets-with -ggplot2) – akrun

+0

@akrun我添加了附加信息 – spore234

回答

1

這是一個解決方法,但它給出了一個情節似乎滿足您的基本目標的情節。 geom_bar被替換爲geom_seqment,因爲這看起來更接近您正在繪製的內容並避免coord_flip的複雜性。條的順序由vars的等級group確定。 y軸標籤不能直接指定,但可以使用geom_text將正確的names值放置在y軸旁邊,以便它們用作標籤。另外,我將刻面標籤切換到左側,這似乎改善了facet和y軸標籤的整體外觀。

set.seed(177) 
df <- data.frame(vars=c(rnorm(3),rnorm(3,2,1), rnorm(3,1,1)), 
       names=c("a","b","c","a","d","b","c","a","f"), 
       groups=c(rep("x",3),rep("y",3),rep("z",3))) 

library(ggplot2) 
sp1 <- ggplot(data=transform(df, ranked=ave(vars, groups, FUN=rank)), 
        aes(x=vars, y=ranked)) 
sp1 <- sp1 + geom_segment(aes(xend = 0, yend = ranked), size=10) 
sp1 <- sp1 + geom_text(aes(x = min(vars), y= ranked, label = names), hjust= 4) 
sp1 <- sp1 + scale_y_discrete(label=NULL) 
sp1 <- sp1 + theme_bw() 
sp1 <- sp1 + facet_grid(groups ~ ., scales="free", switch="y") 
plot(sp1) 

圖上看

enter image description here

+0

完美,謝謝 – spore234