【问题标题】:geom_text in ggplot with geom_col and position "dodge"ggplot 中带有 geom_col 和位置“dodge”的 geom_text
【发布时间】:2019-09-19 16:02:13
【问题描述】:

我的标签有问题。我已阅读有关该主题的其他帖子,但无法弄清楚出了什么问题。你能帮忙吗?

数据:

df <- structure(list(type = c("Activity (ACTIV)", "Activity (ACTIV)", 
"Activity (ACTIV)", "Function (MEREC)", "Meeting (MEONE)", "Meeting (MEONE)", 
"Meeting (MEONE)", "Training (TRAIN)", "Training (TRAIN)", "Training (TRAIN)"
), month = structure(c(1546300800, 1548979200, 1551398400, 1551398400, 
1546300800, 1548979200, 1551398400, 1546300800, 1548979200, 1551398400
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), attendance = c(70, 
258, 125, 150, 2, 71, 180, 80, 105, 32)), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L), vars = "type", drop = TRUE, indices = list(
    0:2, 3L, 4:6, 7:9), group_sizes = c(3L, 1L, 3L, 3L), biggest_group_size = 3L, labels = structure(list(
    type = c("Activity (ACTIV)", "Function (MEREC)", "Meeting (MEONE)", 
    "Training (TRAIN)")), class = "data.frame", row.names = c(NA, 
-4L), vars = "type", drop = TRUE))

这是什么:

[![# A tibble: 10 x 3
# Groups:   type \[4\]
   type             month               attendance
   <chr>            <dttm>                   <dbl>
 1 Activity (ACTIV) 2019-01-01 00:00:00         70
 2 Activity (ACTIV) 2019-02-01 00:00:00        258
 3 Activity (ACTIV) 2019-03-01 00:00:00        125
 4 Function (MEREC) 2019-03-01 00:00:00        150
 5 Meeting (MEONE)  2019-01-01 00:00:00          2
 6 Meeting (MEONE)  2019-02-01 00:00:00         71
 7 Meeting (MEONE)  2019-03-01 00:00:00        180
 8 Training (TRAIN) 2019-01-01 00:00:00         80
 9 Training (TRAIN) 2019-02-01 00:00:00        105
10 Training (TRAIN) 2019-03-01 00:00:00         32

ggplot:

ggplot(df, aes(month, attendance, fill = type)) + 
  geom_col(position = "dodge") + 
  geom_text(aes(label = attendance), position = position_dodge(width =-1), vjust=1)

我明白了,但我希望文本位于相关躲避列的上方,而不是全部位于中间。你能帮忙吗?

【问题讨论】:

    标签: r ggplot2 dplyr tidyverse geom-text


    【解决方案1】:

    我认为问题在于你的 x 审美是约会。解决这个问题的一些方法是使用x = as.factor(month),然后手动设置刻度标签:

    ggplot(df, aes(x = as.factor(month), y = attendance, fill = type, label = attendance)) + 
      geom_col(position = "dodge") +
      geom_text(position = position_dodge(width = 0.9), vjust = -0.5) +
      scale_x_discrete(labels = function(x) format(as.Date(x), "%b"))
    

    或者,您可能希望使用构面:

    ggplot(df, aes(x = type, y = attendance, fill = type, label = attendance)) +
      geom_col() +
      geom_text(vjust = -0.5, size = 3) +
      facet_wrap(~ month) +
      theme(
        axis.text.x = element_text(angle = 60, hjust = 1, size = 6)
      )
    

    最后,这是个人观点,但如果真的需要对“时间”进行比较,我会主张使用折线图。比如:

    ggplot(df, aes(x = month, y = attendance, color = type, label = attendance)) +
      geom_line() +
      geom_point(size = 2.5, fill = "white", shape = 21, stroke = 1, show.legend = FALSE) +
      scale_x_datetime(date_breaks = "1 month", date_labels = "%b")
    

    【讨论】:

    • 感谢您接收日期问题。我希望我不必考虑日期,因为这将是一个多月的问题,但我想现在必须这样做。
    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 2023-02-01
    • 2011-05-12
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多