首页 > 解决方案 > 条形图上的标签在 R 中无法正常工作

问题描述

tibble::tribble(
  ~Course.lvl, ~GRDE_CODE,  ~n, ~rel.percent,
  "100-level",        "A", 95,      "22.1%",
  "100-level",       "A-", 30,         "7%",
  "100-level",        "B", 69,      "16.1%",
  "100-level",       "B-", 24,       "5.6%",
  "100-level",       "B+", 20,       "4.7%",
  "100-level",        "C", 70,      "16.3%",
  "100-level",       "C-", 16,       "3.7%",
  "100-level",       "C+", 25,       "5.8%",
  "100-level",        "D", 33,       "7.7%",
  "100-level",       "D+",  3,       "0.7%",
  "100-level",        "F", 44,      "10.3%",
  "200-level",        "A", 24,      "15.2%",
  "200-level",       "A-", 12,       "7.6%",
  "200-level",        "B", 22,      "13.9%",
  "200-level",       "B-", 10,       "6.3%",
  "200-level",       "B+", 17,      "10.8%",
  "200-level",        "C", 14,       "8.9%",
  "200-level",       "C-", 15,       "9.5%",
  "200-level",       "C+", 13,       "8.2%",
  "200-level",        "D", 13,       "8.2%",
  "200-level",       "D+",  3,       "1.9%",
  "200-level",        "F", 15,       "9.5%",
  "300-level",        "A", 32,      "36.8%",
  "300-level",       "A-", 11,      "12.6%",
  "300-level",        "B",  8,       "9.2%",
  "300-level",       "B-",  9,      "10.3%",
  "300-level",       "B+", 10,      "11.5%",
  "300-level",        "C",  6,       "6.9%",
  "300-level",       "C-",  1,       "1.1%",
  "300-level",       "C+",  7,         "8%",
  "300-level",        "F",  3,       "3.4%",
  "400-level",        "A",  8,      "66.7%",
  "400-level",       "A-",  1,       "8.3%",
  "400-level",       "B+",  2,      "16.7%",
  "400-level",       "C-",  1,       "8.3%"
  )

ggplot(datagra, aes( y=n, x=as.factor(GRDE_CODE))) +
  geom_bar(stat = 'identity', aes(fill=Course.lvl), position = "dodge") +
  geom_text(
    aes(label = rel.percent, 
        y = n),
    vjust = -0.2, size = 3,
    position = position_dodge(0.9),
    color = "black") +
  labs(title =  "MATH Grade Distribution by Level -Fall 2019 & Fall 2020",
       y="Number of Students",
       x ="",) +
  theme_minimal()

这给了我这张

我需要标签与实际条形一致。希望以上内容可以提供足够的数据来帮助reprex。

不知道出了什么问题,我尝试过使用 v 和 h just 和 position dodge,我尝试翻转坐标并尝试了几个我以不同方式调用标签的示例。我希望有一种方法甚至可以用相关的百分比/数字指向相应的栏本身

标签: rggplot2

解决方案


试试这个;它对我有用。

我调整了百分比的类别,因为这样对我来说似乎总是运行得更顺畅一些。

t <- tibble::tribble(
  ~Course.lvl, ~GRDE_CODE,  ~n, ~rel.percent,
  "100-level",        "A", 95,      "22.1%",
  "100-level",       "A-", 30,         "7%",
  "100-level",        "B", 69,      "16.1%",
  "100-level",       "B-", 24,       "5.6%",
  "100-level",       "B+", 20,       "4.7%",
  "100-level",        "C", 70,      "16.3%",
  "100-level",       "C-", 16,       "3.7%",
  "100-level",       "C+", 25,       "5.8%",
  "100-level",        "D", 33,       "7.7%",
  "100-level",       "D+",  3,       "0.7%",
  "100-level",        "F", 44,      "10.3%",
  "200-level",        "A", 24,      "15.2%",
  "200-level",       "A-", 12,       "7.6%",
  "200-level",        "B", 22,      "13.9%",
  "200-level",       "B-", 10,       "6.3%",
  "200-level",       "B+", 17,      "10.8%",
  "200-level",        "C", 14,       "8.9%",
  "200-level",       "C-", 15,       "9.5%",
  "200-level",       "C+", 13,       "8.2%",
  "200-level",        "D", 13,       "8.2%",
  "200-level",       "D+",  3,       "1.9%",
  "200-level",        "F", 15,       "9.5%",
  "300-level",        "A", 32,      "36.8%",
  "300-level",       "A-", 11,      "12.6%",
  "300-level",        "B",  8,       "9.2%",
  "300-level",       "B-",  9,      "10.3%",
  "300-level",       "B+", 10,      "11.5%",
  "300-level",        "C",  6,       "6.9%",
  "300-level",       "C-",  1,       "1.1%",
  "300-level",       "C+",  7,         "8%",
  "300-level",        "F",  3,       "3.4%",
  "400-level",        "A",  8,      "66.7%",
  "400-level",       "A-",  1,       "8.3%",
  "400-level",       "B+",  2,      "16.7%",
  "400-level",       "C-",  1,       "8.3%"
) %>%
  mutate(rel.percent = gsub('\\%', '',rel.percent),
         rel.percent = as.numeric(rel.percent))
         

t %>% 
ggplot(aes(y=n, x=GRDE_CODE, fill = Course.lvl, group = Course.lvl))+
  geom_bar(stat = 'identity', position = "dodge") +
  geom_text(aes(label= paste0(rel.percent, "%")), position=position_dodge(width=0.9), vjust =-.5, size=3) +
  labs(title =  "MATH Grade Distribution by Level -Fall 2019 & Fall 2020",
       y="Number of Students",
       x ="") +
  theme_minimal() +
  scale_fill_manual(values=c("purple","green","steelblue", "grey5"))


推荐阅读