代码之家  ›  专栏  ›  技术社区  ›  stackinator Brenton Wiernik

theme\u bw()从我的绘图中去除所有颜色

  •  3
  • stackinator Brenton Wiernik  · 技术社区  · 7 年前
    library(tidyverse)
    ggplot(mtcars, aes(cyl, mpg)) + 
      geom_point() + 
      theme_bw() + 
      geom_hline(aes(yintercept = 20), color = "red")
    

    theme_bw()

    library(tidyverse)
    library(lubridate)
    
    df <- 
      tibble(
        date = as.Date(41000:42000, origin = "1899-12-30"), 
        value = c(rnorm(500, 5), rnorm(501, 10))
      ) %>% 
      mutate(year = as.factor(year(date)))
    
    ggplot(df, aes(date, value)) + 
      geom_line() + 
      geom_vline(
        xintercept = as.numeric(df$date[yday(df$date) == 1]), color = "red"
      ) + 
      scale_x_date(
        date_labels = "%b", breaks = scales::pretty_breaks(), expand = c(0, 0)
      ) +
      facet_grid(.~ year, space = 'free_x', scales = 'free_x', switch = 'x') +
      labs(x = "") +
      theme_bw(base_size = 14, base_family = 'mono') +
      theme(panel.grid.minor.x = element_blank()) + 
      theme(panel.spacing.x = unit(0, "line")) +
      theme(strip.placement = 'outside', strip.background.x = element_blank()) 
    

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  1
  •   Maurits Evers    7 年前

    可以使用删除镶嵌面面板边框 panel.border = element_blank() 里面 theme

    ggplot(df, aes(date, value)) +
      geom_line() +
      geom_vline(
        xintercept = as.numeric(df$date[yday(df$date) == 1]), color = "red") +
      scale_x_date(
        date_labels = "%b", breaks = scales::pretty_breaks(), expand = c(0, 0)) +
      facet_grid(.~ year, space = 'free_x', scales = 'free_x', switch = 'x') +
      labs(x = "") +
      theme_bw(base_size = 14, base_family = 'mono') +
      theme(
          panel.grid.minor.x = element_blank(),
          panel.spacing.x = unit(0, "line"),
          panel.border = element_blank(),
          strip.placement = 'outside',
          strip.background.x = element_blank())
    

    enter image description here


    使用镶嵌面 让红线不与刻面边界重叠这是一个有点“黑客”的解决方案:

    首先,无面板边框绘制

    gg <- ggplot(df, aes(date, value)) +
          geom_line() +
          geom_vline(
            xintercept = as.numeric(df$date[yday(df$date) == 1]), color = "red") +
          scale_x_date(
            date_labels = "%b", breaks = scales::pretty_breaks(), expand = c(0, 0)) +
          facet_grid(.~ year, space = 'free_x', scales = 'free_x', switch = 'x') +
          labs(x = "") +
          theme_bw(base_size = 14, base_family = 'mono') +
          theme(
              panel.grid.minor.x = element_blank(),
              panel.spacing.x = unit(0, "line"),
              panel.border = element_blank(),
              strip.placement = 'outside',
              strip.background.x = element_blank())
    

    然后我们提取面板的y轴范围,并添加 geom_rect 手动绘制面板边框的步骤

    ylim <- ggplot_build(gg)$layout$panel_params[[1]]$y.range
    gg <- gg +
        geom_rect(
            xmin = min(df$date), xmax = max(df$date),
            ymin = ylim[1], ymax = ylim[2],
            fill = NA, colour = "black")
    

    enter image description here

        2
  •  1
  •   Z.Lin    7 年前

    另一个黑客,如果你愿意深入到grobs:

    gp <- ggplotGrob(p) # where p is the original ggplot object
    
    # for each panel grob, change the order of grobs such that the grob corresponding
    # to geom_vline (should have a name like "GRID.segments.XXXX") lies above the grob
    # corresponding to the facet outline (should have a name like "panel.border..rect.XXXX")
    for(i in grep("panel", gp$layout$name)){
      old.order <- gp$grobs[[i]]$childrenOrder
      new.order <- c(old.order[-grep("segments", old.order)],
                     old.order[grep("segments", old.order)])
      gp$grobs[[i]]$childrenOrder <- new.order
    }
    
    grid::grid.draw(gp)
    

    plot