Barplot与ggplot 2的两个分类变量facet_wrap根据第三个变量displayng百分比

时间:2017-11-24 17:54:45

标签: r ggplot2 bar-chart geom-bar

我想在ggplot2中绘制一个根据第二个分类变量分组的分类变量,并使用facet_wrap将它们分成不同的图。 比我会显示每个的百分比。这是一个可重复的例子

test <- data.frame(
  test1 = sample(letters[1:2], 100, replace = TRUE), 
  test2 = sample(letters[3:5], 100, replace = TRUE),
  test3 = sample(letters[9:11],100, replace = TRUE )
)


ggplot(test, aes(x=factor(test1))) +
  geom_bar(aes(fill=factor(test2), y=..prop.., group=factor(test2)), position="dodge") +
  facet_wrap(~factor(test3))+
  scale_y_continuous("Percentage (%)", limits = c(0, 1), breaks = seq(0, 1, by=0.1), labels = percent)+
  scale_x_discrete("")+
  theme(plot.title = element_text(hjust = 0.5), panel.grid.major.x = element_blank())

这给我一个条形图,每个测试3中test2的百分比为test1。 我想在顶部显示每个栏的百分比。此外,我想在Test2中从因子(test2)更改右侧图例的名称。

enter image description here

1 个答案:

答案 0 :(得分:2)

自己进行数据摘要可能最简单,这样您就可以创建一个包含所需百分比标签的列。 (请注意,我不确定你希望你的百分比显示在方面i,组b中,有一列接近90%,两列大于或等于50% - 是打算?)

库和您的示例数据框:

library(ggplot2)
library(dplyr)

test <- data.frame(
  test1 = sample(letters[1:2], 100, replace = TRUE), 
  test2 = sample(letters[3:5], 100, replace = TRUE),
  test3 = sample(letters[9:11],100, replace = TRUE )
)

首先,按所有列分组(记下订单),然后汇总以获取length的{​​{1}}。 test2获取列高和标签的值 - 在这里,我乘以100并四舍五入。

Mutate

使用汇总数据构建绘图,使用test.grouped <- test %>% group_by(test1, test3, test2) %>% summarize(t2.len = length(test2)) %>% mutate(t2.prop = round(t2.len / sum(t2.len) * 100, 1)) > test.grouped # A tibble: 18 x 5 # Groups: test1, test3 [6] test1 test3 test2 t2.len t2.prop <fctr> <fctr> <fctr> <int> <dbl> 1 a i c 4 30.8 2 a i d 5 38.5 3 a i e 4 30.8 4 a j c 3 20.0 5 a j d 8 53.3 ... 将比例列用作标签:

geom_text

enter image description here