【问题标题】:ggplot2: mixed formats in axis labelsggplot2:轴标签中的混合格式
【发布时间】:2016-12-19 21:29:09
【问题描述】:

我正在构建一个多面线图并想修改轴标签。具体来说,我想通过完全标记每个轴的起始范围来消除视觉冗余,然后对所有后续标签使用速记标签格式。

对于 x 轴,我希望标签以全年 (%Y) 开头,否则仅显示十年 (%y),前面带有撇号。对于 y 轴,我希望上部范围标签后跟一个“%”符号,而所有其他标签只显示数字。

这是这篇文章背后的灵感(注意 y 轴标签的仔细对齐):

我的情节是多面的,尽管我认为这对这个问题并不重要:

df <- 
        tribble(
        ~YEAR, ~FPL_100PCT, ~RENT,     ~GEOG, ~ALL,
        2015,       .270,  .223, 'Seattle',   .152,
        2014,       .212,  .225, 'Seattle',   .148,
        2013,       .181,  .217, 'Seattle',   .145,
        2012,       .166,  .199, 'Seattle',   .126,
        2011,       .236,  .238, 'Seattle',   .145,
        2010,       .241,  .249, 'Seattle',   .156,
        2009,       .246,  .247, 'Seattle',   .141,
        2008,       .187,  .216, 'Seattle',   .139,
        2007,       .226,  .232, 'Seattle',   .142,
        2006,       .233,  .249, 'Seattle',   .155,
        2015,       .200,  .210,      'KC',   .122,
        2014,       .186,  .207,      'KC',   .118,
        2013,       .201,  .215,      'KC',   .124,
        2012,       .189,  .209,      'KC',   .116,
        2011,       .208,  .230,      'KC',   .119,
        2010,       .207,  .233,      'KC',   .126,
        2009,       .206,  .244,      'KC',   .121,
        2008,       .198,  .226,      'KC',   .116,
        2007,       .210,  .229,      'KC',   .120,
        2006,       .226,  .232,      'KC',   .126

) %>% 
        mutate(YEAR = as.Date(as.character(YEAR),format = "%Y"),
               YEAR = floor_date(YEAR, unit = 'year'))%>% 
        gather(TBL,ESTIMATE,FPL_100PCT, RENT, ALL)

gg <- ggplot(data = df, aes(x = YEAR, y = ESTIMATE, color = TBL))
gg <- gg + geom_line()
gg <- gg + scale_y_continuous(breaks = seq(0,.5,.1),labels = scales::percent(seq(0,.5,.1)),limits = c(0,.5))
gg <- gg + scale_x_date(date_breaks =  '1 year', date_labels = '%y')
gg <- gg + facet_grid(. ~GEOG)
gg <- gg + theme_minimal()
gg <- gg + theme(axis.title = element_blank(),
                 legend.title = element_blank(),
                 panel.grid.minor.x = element_blank())
gg <- gg + labs(title = 'Mobility')

谢谢!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您可以简单地提前制定所需的休息时间。我删除了格式化 YEAR 列的部分,因为我发现使用连续而不是日期刻度更容易。

    gg <- ggplot(data = df, aes(x = YEAR, y = ESTIMATE, color = TBL))
    gg <- gg + geom_line()
    gg <- gg + scale_y_continuous(breaks = seq(0,.5,.1),labels = c(0,10,20,30,40,"50%"),limits = c(0,.5))
    gg <- gg + scale_x_continuous(breaks = seq(2007,2015), labels = c(2007, "08","09","10","11","12","13","14","15"))
    gg <- gg + facet_grid(. ~GEOG)
    gg <- gg + theme_minimal()
    gg <- gg + theme(axis.title = element_blank(),
                     legend.title = element_blank(),
                     panel.grid.minor.x = element_blank())
    gg <- gg + labs(title = 'Mobility')
    

    您可以轻松地将其扩展为一个函数,该函数将从数据中构造标签并构造图。

    【讨论】:

      【解决方案2】:

      基于@Jake Kaupp 的回答,混合标签可以表示为如下函数:

      library(magrittr)
      library(stringr)
      
      label_pct <- function(breaks){
              b <- breaks
              b_max <- max(b) %>% scales::percent()
              b_others <- b[(!(b %in% max(b)))]*100 %>% as.integer()
              b_final <- c(b_others,b_max)
              return(b_final)
      }
      
      label_yr <- function(breaks){
              b <- breaks
              b_min <- min(b)
              b_others <- b[(!(b %in% b_min))] %>% str_sub(3,4) %>% paste0("'",.)
              b_final <- c(b_min,b_others)
              return(b_final)
      }
      

      现在可以将它们插入到 Jake 提供的代码中并在其他情节中重复使用

      gg <- ggplot(data = df, aes(x = YEAR, y = ESTIMATE, color = TBL))
      gg <- gg + geom_line()
      gg <- gg + scale_y_continuous(breaks = seq(0,.5,.1),labels = label_pct(seq(0,.5,.1)),limits = c(0,.5))
      gg <- gg + scale_x_continuous(breaks = seq(2007,2015), labels = label_yr(seq(2007,2015)))
      gg <- gg + facet_grid(. ~GEOG)
      gg <- gg + theme_minimal()
      gg <- gg + theme(axis.title = element_blank(),
                       legend.title = element_blank(),
                       panel.grid.minor.x = element_blank())
      gg <- gg + labs(title = 'Mobility')
      

      唯一突出的问题是 y 轴标签中的数字与顶部标签的数字不能很好地对齐,但我暂时称其为“足够好”。

      【讨论】:

      • 将轴文本与主题元素对齐应该注意这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多