Remove grid, background color, and top and right borders from ggplot2

后端 未结 7 1530
生来不讨喜
生来不讨喜 2020-11-29 16:31

I would like to reproduce the plot immediately below by using ggplot2. I can come close, but cannot remove the top and right borders. Below I present several attempts usin

相关标签:
7条回答
  • 2020-11-29 16:42

    The above options do not work for maps created with sf and geom_sf(). Hence, I want to add the relevant ndiscr parameter here. This will create a nice clean map showing only the features.

    library(sf)
    library(ggplot2)
    
    ggplot() + 
      geom_sf(data = some_shp) + 
      theme_minimal() +                     # white background
      theme(axis.text = element_blank(),    # remove geographic coordinates
            axis.ticks = element_blank()) + # remove ticks
      coord_sf(ndiscr = 0)                  # remove grid in the background
    
    0 讨论(0)
  • 2020-11-29 16:46

    An alternative to theme_classic() is the theme that comes with the cowplot package, theme_cowplot() (loaded automatically with the package). It looks similar to theme_classic(), with a few subtle differences. Most importantly, the default label sizes are larger, so the resulting figures can be used in publications without further modifications needed (in particular if you save them with save_plot() instead of ggsave()). Also, the background is transparent, not white, which may be useful if you want to edit the figure in illustrator. Finally, faceted plots look better, in my opinion.

    Example:

    library(cowplot)
    a <- seq(1,20)
    b <- a^0.25
    df <- as.data.frame(cbind(a,b))
    
    p <- ggplot(df, aes(x = a, y = b)) + geom_point()
    save_plot('plot.png', p) # alternative to ggsave, with default settings that work well with the theme
    

    This is what the file plot.png produced by this code looks like: enter image description here

    Disclaimer: I'm the package author.

    0 讨论(0)
  • 2020-11-29 16:47

    EDIT Ignore this answer. There are now better answers. See the comments. Use + theme_classic()

    EDIT

    This is a better version. The bug mentioned below in the original post remains (I think). But the axis line is drawn under the panel. Therefore, remove both the panel.border and panel.background to see the axis lines.

    library(ggplot2)
    a <- seq(1,20)
    b <- a^0.25
    df <- as.data.frame(cbind(a,b))
    
    ggplot(df, aes(x = a, y = b)) + geom_point() +
      theme_bw() +
      theme(axis.line = element_line(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) 
    

    enter image description here

    Original post This gets close. There was a bug with axis.line not working on the y-axis (see here), that appears not to be fixed yet. Therefore, after removing the panel border, the y-axis has to be drawn in separately using geom_vline.

    library(ggplot2)
    library(grid)
    
    a <- seq(1,20)
    b <- a^0.25
    df <- as.data.frame(cbind(a,b))
    
    p = ggplot(df, aes(x = a, y = b)) + geom_point() +
       scale_y_continuous(expand = c(0,0)) +
       scale_x_continuous(expand = c(0,0)) +
       theme_bw() +
       opts(axis.line = theme_segment(colour = "black"),
            panel.grid.major = theme_blank(),
            panel.grid.minor = theme_blank(),
            panel.border = theme_blank()) +
        geom_vline(xintercept = 0)
    p
    

    The extreme points are clipped, but the clipping can be undone using code by baptiste.

    gt <- ggplot_gtable(ggplot_build(p))
    gt$layout$clip[gt$layout$name=="panel"] <- "off"
    grid.draw(gt)
    

    enter image description here

    Or use limits to move the boundaries of the panel.

    ggplot(df, aes(x = a, y = b)) + geom_point() +
       xlim(0,22) +  ylim(.95, 2.1) +
       scale_x_continuous(expand = c(0,0), limits = c(0,22)) +
       scale_y_continuous(expand = c(0,0), limits = c(.95, 2.2)) +   
       theme_bw() +
       opts(axis.line = theme_segment(colour = "black"),
            panel.grid.major = theme_blank(),
            panel.grid.minor = theme_blank(),
            panel.border = theme_blank()) +
        geom_vline(xintercept = 0)
    
    0 讨论(0)
  • 2020-11-29 16:50

    Simplification from the above Andrew's answer leads to this key theme to generate the half border.

    theme (panel.border = element_blank(),
           axis.line    = element_line(color='black'))
    
    0 讨论(0)
  • 2020-11-29 16:53

    I followed Andrew's answer, but I also had to follow https://stackoverflow.com/a/35833548 and set the x and y axes separately due to a bug in my version of ggplot (v2.1.0).

    Instead of

    theme(axis.line = element_line(color = 'black'))
    

    I used

    theme(axis.line.x = element_line(color="black", size = 2),
        axis.line.y = element_line(color="black", size = 2))
    
    0 讨论(0)
  • 2020-11-29 16:59

    Here's an extremely simple answer

    yourPlot +
      theme(
        panel.border = element_blank(), 
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black")
        )
    

    It's that easy. Source: the end of this article

    0 讨论(0)
提交回复
热议问题