使用 ggplot2;如何让 position_dodge() 与这个例子一起工作?

Using ggplot2; How to get position_dodge() to work with this example?

背景

我从 Stephen Few Example 中获取数据并想为每个条形图添加标签以从图形的侧面拉出图例。

"Hack Graphic" 部分中的代码让我到达那里,因为我无法让 position_dodge() 使用文本标签。

加载数据

library(tidyverse)
library(forcats)

### Build data from his table
candidates <- tibble::tibble(`Rating Areas` = c("Experience", 
"Communication", "Friendliness", "Subject matter knowledge", "Presentation", 
"Education"), `Karen Fortou` = c(4,3.5, 4, 4, 3, 3.5), `Mike Rafun` = c(4.5, 
2, 2, 5, 1.5, 4.5), `Jack Nymbul` = c(2.5, 5, 4.5, 2.5, 2.75, 2)) %>%
gather("Candidates", "Score", -`Rating Areas`) 

# The totals for each candidate
totals <- candidates %>% group_by(Candidates) %>% summarise(Score = 
sum(Score))

黑客图形

请注意我是如何使用手动创建的 x 轴值 (x = c(seq(.6,1.35, by = .15), seq(1.6,2.35, by = .15), seq(2.6,3.35, by = .15))) 来放置标签的,而不是像 .

中描述的那样使用 position = position_dodge()
candidates %>% 
  ggplot(aes(x = fct_reorder(Candidates, Score), y = Score)) +
  geom_col(data = totals, alpha = .45) +
  geom_col(aes(fill = `Rating Areas`), position = position_dodge(.9), color = "black", 
           show.legend = FALSE) +
  geom_text(label = rep(c("Experience", "Communication", "Friendliness", 
           "Subject matter knowledge", "Presentation", "Education"),3), 
            x = c(seq(.6,1.35, by = .15), seq(1.6,2.35, by = .15), 
            seq(2.6,3.35, by = .15)), y = 5.1, angle = 90, color = "black", 
            hjust = "left", size = 4, fontface = "bold") +
  scale_fill_brewer(type = "qual") + 
  scale_y_continuous(breaks = seq(0, 25, by = 2)) +
  theme_bw() + 
  labs(x = "\nCandidates", y = "Rating Score") +
  theme(axis.text.x = element_text(size = 14, color = "black"), legend.text = element_text(size = 14),
    legend.title = element_text(size = 15), axis.title = element_text(size = 15))

图形代码不起作用

当我使用geom_text(aes(label =评级区域), position = position_dodge(width = 0.9), angle = 90, color = "black", hjust = "left", size = 4, fontface = "bold")按照上一个 Stack 答案中的示例进行操作时,它不会将标签展开到每个栏中。

我一定是遗漏了一些明显的东西。 请帮助如何让 position_dodge() 使用此示例?

candidates %>% 
  ggplot(aes(x = fct_reorder(Candidates, Score), y = Score)) +
  geom_col(data = totals, alpha = .45) +
  geom_col(aes(fill = `Rating Areas`), position = position_dodge(.9), color = "black", show.legend = FALSE) +
  geom_text(aes(label = `Rating Areas`), position = position_dodge(width = 0.9), angle = 90, color = "black", hjust = "left", size = 4, fontface = "bold") +
  scale_fill_brewer(type = "qual") + 
  scale_y_continuous(breaks = seq(0, 25, by = 2)) +
  theme_bw() + 
  labs(x = "\nCandidates", y = "Rating Score") +
  theme(axis.text.x = element_text(size = 14, color = "black"), legend.text = element_text(size = 14), legend.title = element_text(size = 15), axis.title = element_text(size = 15))

我认为 geom_colgeom_text 需要相同的映射。可以给geom_text的美感加上fill = Rating Areas。不过你会收到警告。

candidates %>% 
    ggplot(aes(x = fct_reorder(Candidates, Score), y = Score)) +
    geom_col(data = totals, alpha = .45) +
    geom_col(aes(fill = `Rating Areas`), position = position_dodge(.9), color = "black", show.legend = FALSE) +
    geom_text(aes(fill = `Rating Areas`, label = `Rating Areas`), position = position_dodge(width = 0.9), angle = 90, color = "black", hjust = "left", size = 4, fontface = "bold") +
    scale_fill_brewer(type = "qual") + 
    scale_y_continuous(breaks = seq(0, 25, by = 2)) +
    theme_bw() + 
    labs(x = "\nCandidates", y = "Rating Score") +
    theme(axis.text.x = element_text(size = 14, color = "black"), legend.text = element_text(size = 14), legend.title = element_text(size = 15), axis.title = element_text(size = 15))

编辑: 这里有一种方法可以在没有警告的情况下执行此操作:

candidates %>% 
    ggplot(aes(x = fct_reorder(Candidates, Score), y = Score, fill = `Rating Areas`)) +
    geom_col(data = totals, aes(x = fct_reorder(Candidates, Score), y = Score), alpha = .45, inherit.aes = FALSE) +
    geom_col(position = position_dodge(.9), color = "black", show.legend = FALSE) +
    geom_text(aes(label = `Rating Areas`), position = position_dodge(width = 0.9), angle = 90, color = "black", hjust = "left", size = 4, fontface = "bold") +
    scale_fill_brewer(type = "qual") + 
    scale_y_continuous(breaks = seq(0, 25, by = 2)) +
    theme_bw() + 
    labs(x = "\nCandidates", y = "Rating Score") +
    theme(axis.text.x = element_text(size = 14, color = "black"), legend.text = element_text(size = 14), legend.title = element_text(size = 15), axis.title = element_text(size = 15))