如何在堆叠的条形图中订购条形以及放置%标签

时间:2018-07-14 13:48:30

标签: r sorting ggplot2 labels stacked

我的数据的最小子集是

mydata <- read.table(header = TRUE, text= "
                     Product    Characteristic  Product_category
AA  Functional  A
                     AB Functional  A
                     AB Portable    A
                     BA Portable    B
                     BA Quality B
                     BB Quality B
                     BA Bright  B
                     BB Sound   B
                     BB Sound   B
                     BC Sound   B
                     BC Sound   B
                     BC Work    B
                     CA Functional  C
                     CA Functional  C
                     CA Functional  C
                     CA Functional  C
                     CB Functional  C
                     CC Functional  C
                     CC Functional  C
                     CC Functional  C
                     CC Functional  C
                     CC Portable    C
                     CC Design  C
                     CD Quality C
                     CD Quality C
                     CD Output  C
                     CD Noise   C
                     CD Noise   C
                     CD Component   C
                     CD Component   C

                     ")

我想制作3个对应于3种产品类别的条形图,其中x =特征和y轴具有每个特征的计数。此外,我想将栏与产品堆叠在一起。因此,假设产品代码A的条码代码为-

mydata %>% filter(Product_category == "A") %>% 
  ggplot(aes(x=Characteristic, fill = Product)) + geom_bar(width = 0.2) + coord_flip()

这部分很容易。我在两件事上苦苦挣扎-我想按每个特征计数的降序对堆叠的条进行排序。此数据集是我的数据集的最小子集,因此默认情况下,条形图可能显示为有序,但在我的实际数据集中却不是。我想做的第二件事是用百分比标记每个条,这样百分比就在每个产品类别中-公式= count(Characteristic)/ sum(count(Characteristic))。所以我希望我的最终图形如下所示-

mydata %>% filter(Product_category == "A") %>% 
  group_by(Characteristic) %>%
  summarize(counts = n()) %>% arrange(counts) %>%
  mutate(Characteristic = factor(Characteristic, Characteristic), perc = counts/sum(counts)) %>%
  ggplot(aes(x=Characteristic, y = counts)) + 
  geom_bar(stat = "identity", width = 0.4) + 
  theme(axis.text.x=element_blank()) + 
  geom_text(aes(label = paste(round(perc*100, digits = 1),"%",sep = "")), hjust = -0.2, size = 2.8, position = position_dodge(width = 0.7), inherit.aes = TRUE) + 
  coord_flip()

唯一的区别是我希望每个条形图按产品堆叠,因此我可以直观地看到每个特征在每个特征中的份额。我尝试了许多事情,但每件事都很冗长,但仍然无法达到预期的效果。最整齐的方法是什么?

1 个答案:

答案 0 :(得分:0)

您应该能够使用一点dplyr并使用forcats来排序因子。正如您所指出的那样,由于您要过滤的类别中没有很多观察结果,因此我进行过滤只是为了说明更多数据,并且为了简化计算而跳过了图中的一些细节。例。这样做的关键是将CharacteristicProduct设置为因子,然后使用Product来设置填充,因此您在每个特性内都有每种产品的堆叠区域。

您还可以简化其他几件事:geom_col等效于geom_bar(stat = "identity"),而scales::percent将执行您拥有的百分比格式。为了使每个条形文字中都包含文本,请将position_stackvjust = 0.5一起使用以使标签居中。

library(tidyverse)

mydata %>%
  # filter(Product_category == "A") %>%
  group_by(Characteristic, Product) %>%
  summarise(counts = n()) %>%
  mutate(perc = round(counts / sum(counts), digits = 3)) %>%
  ungroup() %>%
  mutate(Characteristic = as.factor(Characteristic) %>% fct_reorder(counts, .fun = sum)) %>%
  arrange(Characteristic, perc) %>%
  mutate(Product = as.factor(Product) %>% fct_reorder(perc, .desc = F)) %>%
  ggplot(aes(x = Characteristic, y = counts, fill = Product)) +
    geom_col(position = "stack") +
    geom_text(aes(label = scales::percent(perc)), 
              position = position_stack(vjust = 0.5), size = 3) +
    coord_flip()

reprex package(v0.2.0)于2018-07-14创建。