【问题标题】:How to add label to geom_segment at the start of the segment?如何在段的开头向 geom_segment 添加标签?
【发布时间】:2017-07-14 21:45:18
【问题描述】:

我确定这很简单,但我想不通。

我有以下图表:

library(data.table)
library(magrittr)
library(ggplot2)

cambodia <- 
    data.table(Period = c("Funan", "Chenla/Zhenla","Khmer Empire","Dark Ages of Cambodia"),
               StartDate = c(-500,550,802,1431), 
               EndDate = c(550,802,1431,1863), 
               Color = c("lightblue","lightgreen","lightyellow","pink")) %>%
    extract(order(-StartDate)) %>%
    extract(, Period := factor(Period,levels = Period))

ggplot() +
    geom_segment(data=cambodia, aes(x=StartDate, xend=EndDate, y=Period, yend=Period, color=Color), 
                 linetype=1, size=2) +
    scale_colour_brewer(palette = "Pastel1")+
    xlab("Date")+
    ylab("Ruler")+
    theme_bw() + 
    theme(panel.grid.minor = element_blank(), panel.grid.major =   element_blank()) + 
    theme(aspect.ratio = .2) +
    theme(legend.position="none")

但我希望标签不在轴上并在页面上。在线的左边或中间的顶部。例如

geom_text 的大多数示例都给了我 gobbledeegook。我似乎无法将它们应用于我在这里拥有的因子数据。你知道怎么做吗? 谢谢

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    在片段末尾添加标签可能会扭曲片段长度和位置到年份范围的视觉映射。您可以将标签放在段的中间。

    library(data.table)
    library(magrittr)
    library(ggplot2)
    library(stringr)
    
    cambodia <- 
      data.table(Period = c("Funan", "Chenla/Zhenla","Khmer Empire","Dark Ages of Cambodia"),
                 StartDate = c(-500,550,802,1431), 
                 EndDate = c(550,802,1431,1863), 
                 Color = c("lightblue","lightgreen","lightyellow","pink")) %>%
      extract(order(-StartDate)) %>%
      extract(, Period := factor(Period,levels = Period))
    
    ggplot(cambodia, aes(x=StartDate, xend=EndDate, y=Period, colour=Period)) +
      geom_segment(aes(xend=EndDate, yend=Period), linetype=1, size=2) +
      geom_label(aes(label=str_wrap(Period,12), x=(StartDate + EndDate)/2), size=3) +
      scale_colour_brewer(palette = "Set1") +
      xlab("Date")+ ylab("Ruler")+
      theme_bw() + 
      theme(panel.grid.minor = element_blank(), panel.grid.major = element_blank(), 
            aspect.ratio = .2,
            legend.position="none",
            axis.text.y=element_blank(),
            axis.ticks.y=element_blank())
    

    或者如何做到最小化:

    ggplot(cambodia, aes(x=StartDate, y=1)) +
      geom_rect(aes(xmin=StartDate, xmax=EndDate, ymin=0.97, ymax=1.03, fill=Period), 
                show.legend=FALSE, colour="white", size=0.5) +
      geom_label(aes(label=str_wrap(Period,12), x=(StartDate + EndDate)/2), size=3.5) +
      geom_text(aes(label=StartDate, y=0.96), size=3.5) +
      geom_text(aes(label=ifelse(EndDate==max(EndDate), EndDate,""), x=EndDate, y=0.96), size=3.5) +
      scale_colour_brewer(palette = "Set1") +
      scale_y_continuous(limits=c(0.95,1.05)) +
      theme_void() 
    

    【讨论】:

      【解决方案2】:
      ggplot() +
        geom_segment(data=cambodia, aes(x=StartDate, xend=EndDate, y=Period, yend=Period, color=Color), 
                     linetype=1, size=2) +
        geom_label(data=cambodia, aes(x=StartDate, y=Period,  label = Period),
                   nudge_x = c(-300, -200, -200, -100)) +
        scale_colour_brewer(palette = "Pastel1")+
        xlab("Date")+
        ylab("")+
        theme_bw() + 
        theme(legend.position="none") +
        theme(aspect.ratio = .2) +
        theme(panel.grid.minor = element_blank(), panel.grid.major =   element_blank(),
              axis.line.y = element_blank(), axis.text.y = element_blank(),
              axis.ticks.y = element_blank())
      

      您需要使用element_blank() 删除y 轴元素,然后使用geom_label 中的nudge_x 参数来适当地偏移标签。

      【讨论】:

      • 您可以避免使用类似以下内容对微调进行硬编码:geom_label(aes(x=StartDate - 0.005*(max(EndDate) - min(StartDate)), y=Period, label = Period), hjust=1)
      猜你喜欢
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多