如何在ggplot2中制作单一堆积条形图?

16
Ancestry <- data.frame(Race = c("European", "African American", "Asian", "Hispanic", "Other"), Proportion = c(40, 30, 10, 15, 5))
Ancestry %>% 
ggplot(aes(y = Proportion, fill = Race)) + 
  geom_bar(stat="identity", colour="white")

运行上述代码会给我以下错误:

Warning in min(x, na.rm = na.rm) :
  no non-missing arguments to min; returning Inf
Warning in max(x, na.rm = na.rm) :
  no non-missing arguments to max; returning -Inf
Warning in min(diff(sort(x))) :
  no non-missing arguments to min; returning Inf
Warning in x - width/2 :
  longer object length is not a multiple of shorter object length
Warning in x + width/2 :
  longer object length is not a multiple of shorter object length
Error in data.frame(list(y = c(40, 30, 10, 15, 5), fill = c(3L, 1L, 2L,  : 
  arguments imply differing number of rows: 5, 2947

我希望创建一个类似于这个的堆叠条形图:

enter image description here

3个回答

17
你需要为x轴创建一个哑变量。然后使用geom_col,它类似于geom_bar(stat = "identity")来绘制堆叠条形图 + geom_text将文本放置在条形图上。您展示的图使用了ggthemes包中的theme_economist
library(tidyverse)

Ancestry <- data.frame(Race = c("European", "African American", "Asian", "Hispanic", "Other"), 
                       Proportion = c(40, 30, 10, 15, 5))

Ancestry <- Ancestry %>% 
  mutate(Year = "2006")

ggplot(Ancestry, aes(x = Year, y = Proportion, fill = Race)) +
  geom_col() +
  geom_text(aes(label = paste0(Proportion, "%")),
            position = position_stack(vjust = 0.5)) +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal(base_size = 16) +
  ylab("Percentage") +
  xlab(NULL)

library(ggthemes)

ggplot(Ancestry, aes(x = Year, y = Proportion, fill = Race)) +
  geom_col() +
  geom_text(aes(label = paste0(Proportion, "%")),
            position = position_stack(vjust = 0.5)) +
  theme_economist(base_size = 14) +
  scale_fill_economist() +
  theme(legend.position = "right", 
        legend.title = element_blank()) +
  theme(axis.title.y = element_text(margin = margin(r = 20))) +
  ylab("Percentage") +
  xlab(NULL)

这段文字是在2018年08月26日使用reprex package(v0.2.0.9000)创建的。


4
可以使用aes(x = "2006")代替虚拟变量。 - Benjamin Ziepert

5

我们可以创建一个哑变量来将所有条目分组到一个组中,然后使用geom_bar创建堆叠条形图,并使用geom_text命名Proportions

library(ggplot2)

#Dummy group variable
Ancestry$row <- 1

#Create a label variable
Ancestry$percent <- (Ancestry$Proportion/sum(Ancestry$Proportion)) * 100

ggplot(Ancestry, aes(x = row,y = Proportion, fill = Race)) +
    geom_bar(stat="identity") + 
    geom_text(aes(label = percent), 
        position = position_stack(vjust = 0.5))

enter image description here


1
您不需要为x轴创建虚拟分组变量来创建单个堆叠条形图。您可以在aes()中添加一个空字符串来指定轴。此外,theme_blank()会删除所有不必要的网格,使其更加整洁。
library(tidyverse)
Ancestry <- tibble(Race = c("European", "African American", "Asian", "Hispanic", "Other"), 
                   Proportion = c(40, 30, 10, 15, 5))
ggplot(Ancestry, aes(x = "", y = Proportion, fill = Race)) +
       geom_col() +
       geom_text(aes(label = paste0(Proportion, "%")), 
                     position = position_stack(vjust = 0.5)) +
       scale_fill_brewer(palette = "Set2") +
       theme_blank() +
       labs(x="", y="Percentage")

Single line stacked barchart


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接