条形图中的多行和facet_grid

时间:2016-05-28 16:38:06

标签: r ggplot2 dataframe

我有一个包含53个状态和性别变量的数据框。例如下面的DF有26个州。

set.seed(25)
test <- data.frame(
  state = sample(letters[1:26], 10000, replace = TRUE), 
  sex = sample(c("M","F"), 10000, replace = TRUE)
)

现在我想看看哪个州有更多的女性成员,所以我在网格中为每个州创建了一个条形图,每个网格都有两个条形(M,F)。

test.pct = test %>% group_by(state, sex) %>%
  summarise(count=n()) %>%
  mutate(pct=count/sum(count)) 

ggplot(test.pct, aes(x=sex, y=pct, fill=sex)) +
  geom_bar(stat="identity") +
  facet_grid(. ~ state) 

问题是所有这26个网格都出现在单行 - 可见性问题中。我想用多帧构造图,例如3X9而不是1X26。

此外,应根据女性百分比订购州。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

问题#1:使用facet_wrap。问题#2:事先重新排序状态级别。

看起来像这样:

ggplot(transform(test.pct, state=factor(state, 
                                        levels=with(subset(test.pct, sex=="F"), 
                                                    state[order(pct)]))), 
       aes(x=sex, y=pct, fill=sex)) +
  geom_bar(stat="identity") +
  facet_wrap(~ state, nrow = 3) 

答案 1 :(得分:0)

第一部分很简单:只使用facet_wrap代替facet_grid。排序有点棘手;你必须重新排序因子的水平。为了让它更清晰一些,我将操作分成几步。首先,仅提取女性百分比,然后找到这些百分比的顺序,最后使用该顺序重新排列state级别的顺序。这是一种冗长的做法,但我希望它能使原则明确。

wom.pct <- test.pct %>% filter(sex == 'F')
ix <- order(wom.pct$pct)
test.pct$state <- factor(test.pct$state, levels = letters[1:26][ix])

ggplot(test.pct, aes(x=sex, y=pct, fill=sex)) +
  geom_bar(stat="identity") +
  facet_wrap( ~ state)