【问题标题】:accurate placement of geom_text label on a month axis在月份轴上准确放置 geom_text 标签
【发布时间】:2017-10-19 09:09:26
【问题描述】:

如何调整geom_text使其正常可见?

data <- read.table(text = "      months preMonth postMonth preOnc postOnc
1 2017-10-19      958       543    242     657
2 2017-11-19      958       177    242    1023
3 2017-12-19      958       127    242    1073
4 2018-01-19      958        41    242      NA
5 2018-02-19      958        21    242      NA
6 2018-03-19      958        21    242      NA")


dataLong <- data %>% tidyr::gather(Type, Amount, 2:5) %>% filter(!is.na(Amount))
dataLong$delim <- substr(dataLong$Type, 1, 3)
dataLong$Type <- factor(dataLong$Type, levels = c("preOnc", "postOnc", "preMonth", "postMonth"))
dataLong$delim <- factor(dataLong$delim, levels = c('pre', 'pos'))
ggplot(dataLong, aes(x=months, y=Amount, fill=Type)) + 
  geom_bar(stat = "identity") +
  geom_hline(yintercept = 1200, col='red',linetype='dashed') + 
  geom_text(aes(x=months[1], y= 1200 ,label = "Expected: 1200", vjust = -1)) +
  facet_grid(. ~ delim,  labeller=label_both) + 
  scale_fill_manual(values = c("grey", "grey", "seagreen3", "seagreen3")) +
  scale_x_date(date_breaks = "1 month", date_labels = "%b-%y")

【问题讨论】:

    标签: r ggplot2 geom-text


    【解决方案1】:

    你想要这个吗?

    注意geom_text() 调用中的hjust = -1, vjust = -0.5

    library(tidyverse)
    
    data <- read.table(text = "      months preMonth postMonth preOnc postOnc
    1 2017-10-19      958       543    242     657
    2 2017-11-19      958       177    242    1023
    3 2017-12-19      958       127    242    1073
    4 2018-01-19      958        41    242      NA
    5 2018-02-19      958        21    242      NA
    6 2018-03-19      958        21    242      NA")
    
    # the tidyverse (in this case dplyr) case of preparing the data 
    dataLong <- data %>% 
      gather(Type, Amount, 2:5) %>% 
      filter(!is.na(Amount)) %>% 
      mutate(
        delim =  substr(Type, 1, 3),
        Type = factor(Type, levels = c("preOnc", "postOnc", "preMonth", "postMonth")),
        delim = factor(delim, levels = c("pre", "pos")),
        months = as.Date(months)
        )
    
    ggplot(dataLong, aes(x = months, y = Amount, fill = Type)) + 
      geom_bar(stat = "identity") +
      geom_hline(yintercept = 1200, col = "red",linetype = "dashed") + 
      geom_text(aes(x = months[1], y = 1200, label = "Expected: 1200"), 
                vjust = -0.5, hjust = -1) +
      facet_grid(. ~ delim, labeller = label_both) + 
      scale_fill_manual(values = c("grey", "grey", "seagreen3", "seagreen3")) +
      scale_x_date(date_breaks = "1 month", date_labels = "%b-%y")
    

    居中 geom_label 的替代方法

    # first compute the middle of the range of months
    mid_month <- range(dataLong$months) %>% {(.[2] - .[1]) / 2 + .[1]}
    
    ggplot(dataLong, aes(x = months, y = Amount, fill = Type)) + 
      geom_bar(stat = "identity") +
      geom_hline(yintercept = 1200, col = "red",linetype = "dashed") +
    
      # use geom_label and hardcode the parameters
      geom_label(x = mid_month, y = 1200, label = "Expected: 1200", 
                 vjust = 0.5, hjust = 0.5, color = "red", inherit.aes = F) +
      facet_grid(. ~ delim, labeller = label_both) + 
      scale_fill_manual(values = c("grey", "grey", "seagreen3", "seagreen3")) +
      scale_x_date(date_breaks = "1 month", date_labels = "%b-%y")
    

    如果没有inherit.aes = F,我们也会为图例分配颜色(我们没有)...

    【讨论】:

    • 或者你想让文本居中?
    • 感谢这两种方法。我不喜欢将标签居中,但我会使用第二种方法,因为我更喜欢它。
    • @David 感谢您展示geom_label。直到现在才真正知道它的存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多