我的数据的最小子集是
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()
唯一的区别是我希望每个条形图按产品堆叠,因此我可以直观地看到每个特征在每个特征中的份额。我尝试了许多事情,但每件事都很冗长,但仍然无法达到预期的效果。最整齐的方法是什么?
答案 0 :(得分:0)
您应该能够使用一点dplyr
并使用forcats
来排序因子。正如您所指出的那样,由于您要过滤的类别中没有很多观察结果,因此我进行过滤只是为了说明更多数据,并且为了简化计算而跳过了图中的一些细节。例。这样做的关键是将Characteristic
和Product
设置为因子,然后使用Product
来设置填充,因此您在每个特性内都有每种产品的堆叠区域。
您还可以简化其他几件事:geom_col
等效于geom_bar(stat = "identity")
,而scales::percent
将执行您拥有的百分比格式。为了使每个条形文字中都包含文本,请将position_stack
与vjust = 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创建。