ggplot2堆叠在一起并将条形图分组

时间:2019-02-10 00:54:58

标签: r ggplot2 bar-chart stacked-chart

我正在尝试复制此enter image description here

到目前为止,我有enter image description here

但是我需要相反的内容-下方的年份和顶部的国家/地区作为标签。

两个SO答案在这里

Firstsecond

代码

ggplot(ownership, aes(x = Country, y = Percent, fill = Category)) + 
geom_bar(stat = 'identity', position = 'stack') + facet_grid(~ Year) +
theme_tufte() +
scale_fill_brewer(palette = "Paired") +
theme(axis.title.y = element_blank()) +
theme(axis.title.x = element_blank()) +
theme(legend.text = element_text(size = 10)) +
theme(axis.text.x = element_text(size = 12)) +
theme(axis.text.y = element_text(size = 12)) +
theme(plot.margin = margin(0.1, 0.1, 0.1, 0.1, "cm")) +
theme(legend.position = "bottom") +
theme(legend.title = element_blank())

数据

> dput(ownership)

structure(list(Country = c("Cote d'Ivoire", "Cote d'Ivoire", 
"Ethiopia", "Ethiopia", "Kenya", "Kenya", "Nigeria", "Nigeria", 
"Senegal", "Senegal", "South Africa", "South Africa", "Uganda", 
"Uganda", "Cote d'Ivoire", "Cote d'Ivoire", "Ethiopia", "Ethiopia", 
"Kenya", "Kenya", "Nigeria", "Nigeria", "Senegal", "Senegal", 
"South Africa", "South Africa", "Uganda", "Uganda", "Cote d'Ivoire", 
"Cote d'Ivoire", "Ethiopia", "Ethiopia", "Kenya", "Kenya", "Nigeria", 
"Nigeria", "Senegal", "Senegal", "South Africa", "South Africa", 
"Uganda", "Uganda"), Year = c(2014, 2017, 2014, 2017, 2014, 2017, 
 2014, 2017, 2014, 2017, 2014, 2017, 2014, 2017, 2014, 2017, 2014, 
 2017, 2014, 2017, 2014, 2017, 2014, 2017, 2014, 2017, 2014, 2017, 
 2014, 2017, 2014, 2017, 2014, 2017, 2014, 2017, 2014, 2017, 2014, 
 2017, 2014, 2017), Percent = c(10, 7, 22, 35, 16, 9, 42, 34, 
 9, 11, 56, 50, 9, 9, 5, 7, 0, 0, 39, 47, 2, 5, 3, 10, 13, 17, 
 18, 24, 19, 27, 0, 0, 19, 26, 0, 0, 4, 22, 2, 2, 17, 26), Category = 
 c("Category A", 
 "Category A", "Category A", "Category A", "Category A", "Category A", 
 "Category A", "Category A", "Category A", "Category A", "Category A", 
 "Category A", "Category A", "Category A", "Category B", "Category B", 
 "Category B", "Category B", "Category B", "Category B", "Category B", 
 "Category B", "Category B", "Category B", "Category B", "Category B", 
 "Category B", "Category B", "Category C", "Category C", "Category C", 
 "Category C", "Category C", "Category C", "Category C", "Category C", 
 "Category C", "Category C", "Category C", "Category C", "Category C", 
 "Category C")), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
 ), row.names = c(NA, -42L), spec = structure(list(cols = list(
 Country = structure(list(), class = c("collector_character", 
 "collector")), Year = structure(list(), class = c("collector_double", 
 "collector")), Percent = structure(list(), class = c("collector_double", 
 "collector")), Category = structure(list(), class = 
 c("collector_character", 
 "collector"))), default = structure(list(), class = c("collector_guess", 
 "collector")), skip = 1), class = "col_spec"))

任何提示都值得赞赏!

已更新

更改X = Yearfacet_grid(~ Country)后,在x轴上出现了一些问题,我得到了更好的结果。 R对年份的处理方式与我预期的不同。我有2014和2017,它为我提供2014、2016、2017。

enter image description here

3 个答案:

答案 0 :(得分:1)

不要使用facet_grid(~ Year),这将使这两年成为两个并排的图表(与现在一样)。

通过使用国家/地区年份变量,您可以得到与想要的图形相似的图形,因此:

ownership$CountryYear <- paste(ownership$Country, ownership$Year) 

然后:

ggplot(ownership, aes(x = CountryYear, y = Percent, fill = Category)) + 
geom_bar(stat = 'identity', position = 'stack') + 
...

但是您可能需要在标签上进行很多操作才能获得与您想要的图形完全相同的图形。

答案 1 :(得分:1)

这将使您关闭(由于未提供任何数据,因此使用了模拟数据):

library(ggplot2)
#make similar data
df <- expand.grid(country = letters[1:4],
                 year = c("2014", "2017"),
                 category = LETTERS[1:3])
df$percent <- runif(nrow(df))


ggplot(df, aes(year, percent, fill = category)) +
  geom_bar(stat = "identity") +
  facet_wrap(~country, ncol = 4, strip.position = "bottom") +
  theme(legend.position = "none")

reprex package(v0.2.1)于2019-02-09创建

答案 2 :(得分:0)

亲自解决。我在x轴上添加了as.character()

最终密码

ggplot(ownership, aes(x = as.character(Year), y = Percent, fill = Category)) + 
geom_bar(stat = 'identity', position = 'stack') + facet_grid(~ Country) +
theme_tufte() +
scale_fill_brewer(palette = "Paired") +
theme(axis.title.y = element_blank()) +
theme(axis.title.x = element_blank()) +
theme(legend.text = element_text(size = 10)) +
theme(axis.text.x = element_text(size = 12)) +
theme(axis.text.y = element_text(size = 12)) +
theme(legend.position = "bottom") +
theme(legend.title = element_blank()) 

完成!谢谢!

enter image description here

相关问题