使用不同的变量自定义 ggplot2 图例

Customize ggplot2 legend with different variables

我有以下关于美国和德国青少年编码技能的数据。我可以很容易地展示他们的条形图,但我还需要展示每个国家的青少年总数。

DF <- data.frame(code = rep(c("A","B","C"), each = 2),
                 Freq = c(441,121,700,866,45,95),
                 Country = rep(c("USA","Germany"),3),
                 Total = rep(c(1186,1082),3))  

ggplot(DF, aes(code, Freq, fill = code)) + geom_bar(stat = "identity", alpha = 0.7) + 
  facet_wrap(~Country, scales = "free") +
  theme_bw() +
  theme(legend.position="none") 

例如,我可以用 CountryTotal 代替 code 的默认图例。感谢您的帮助

以下是我的建议:

library(dplyr); library(ggplot2)
DF %>%
  add_count(Country, wt = Total) %>%
  mutate(Country_total = paste0(Country, ": Total=", n)) %>%
  ggplot(aes(code, Freq, fill = code)) + geom_bar(stat = "identity", alpha = 0.7) + 
    facet_wrap(~Country_total, scales = "free") +
    theme_bw() +
    theme(legend.position="none") 

做你要求的事情会采取不同的方法,因为你描述的数据严格来说不是 ggplot2 图例(它解释了一个变量如何映射到一个图形美学),而是显示在绘图旁边的 table 或注释。这可以单独生成并使用 patchworkgrid 包添加到图中。

例如:

library(patchwork); library(gridExtra)
ggplot(DF, aes(code, Freq, fill = code)) + geom_bar(stat = "identity", alpha = 0.7) + 
  facet_wrap(~Country, scales = "free") +
  theme_bw() +
  theme(legend.position="none") +
  tableGrob(count(DF, Country, wt = Total)) +
  plot_layout(widths = c(2,1))