从ggplot2中删除网格,背景颜色以及顶部和右侧边框

时间:2012-06-02 11:00:05

标签: r ggplot2

我想通过使用ggplot2重现下面的情节。我可以靠近,但不能删除顶部和右边界。下面我介绍几次使用ggplot2的尝试,包括在Stackoverflow上或通过Stackoverflow找到的一些建议。不幸的是,我无法将这些建议付诸实践。

我希望有人能够纠正下面的一个或多个代码段。

感谢您提出任何建议。

# desired plot
a <- seq(1,20)
b <- a^0.25
plot(a,b, bty = "l")


library(ggplot2)

df <- as.data.frame(cbind(a,b))

# 1. ggplot2 default
ggplot(df, aes(x = a, y = b)) + geom_point()

# 2. removes background color
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black'))

# 3. also removes gridlines
none <- theme_blank()
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none)

# 4. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.border = none)

# 5. does not remove top and right border
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(axis.line = theme_segment())

# 6. removes x and y axis in addition to top and right border
# http://stackoverflow.com/questions/5458409/remove-top-and-right-border-from-ggplot2
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.background=theme_rect(colour=NA))

# 7. returns error when attempting to remove top and right border
# https://groups.google.com/group/ggplot2/browse_thread/thread/f998d113638bf251
#
# Error in el(...) : could not find function "polylineGrob"
#
theme_L_border <- function(colour = "black", size = 1, linetype = 1) { 
   structure( 
     function(x = 0, y = 0, width = 1, height = 1, ...) { 
       polylineGrob( 
         x=c(x+width, x, x), y=c(y,y,y+height), ..., default.units = "npc", 
         gp=gpar(lwd=size, col=colour, lty=linetype), 
       ) 
     }, 
     class = "theme", 
     type = "box", 
     call = match.call() 
   )
}

ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts( panel.border = theme_L_border())

7 个答案:

答案 0 :(得分:114)

编辑忽略此答案。现在有更好的答案。查看评论。使用+ theme_classic()

修改

这是一个更好的版本。原始帖子中提到的错误仍然存​​在(我认为)。但轴线在面板下绘制。因此,请同时删除panel.borderpanel.background以查看轴线。

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

原帖 这很接近。有一个axis.line无法在y轴(see here)上工作的错误,似乎尚未修复。因此,在移除面板边框后,必须使用geom_vline单独绘制y轴。

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

剪切了极值点,但可以使用baptiste之前的代码撤消裁剪。

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

enter image description here

或使用limits移动面板的边界。

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)

答案 1 :(得分:73)

ggplot(0.9.2+)的最新更新已经彻底改变了主题的语法。最值得注意的是,opts()现已弃用,已被theme()取代。 Sandy's答案仍将(截至12月1日)生成一个图表,但会导致R抛出一堆警告。

这是反映当前ggplot语法的更新代码:

library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- as.data.frame(cbind(a,b))

#base ggplot object
p <- ggplot(df, aes(x = a, y = b))

p +
  #plots the points
  geom_point() +

  #theme with white background
  theme_bw() +

  #eliminates background, gridlines, and chart border
  theme(
    plot.background = element_blank()
   ,panel.grid.major = element_blank()
   ,panel.grid.minor = element_blank()
   ,panel.border = element_blank()
  ) +

  #draws x and y axis line
  theme(axis.line = element_line(color = 'black'))

产生

plot output

答案 2 :(得分:21)

theme_classic()的替代方法是cowplottheme_cowplot()附带的主题(随包自动加载)。它看起来类似于theme_classic(),但有一些细微差别。最重要的是,默认标签尺寸较大,因此生成的图形可以在出版物中使用而无需进一步修改(特别是如果您使用save_plot()而不是ggsave()保存它们)。此外,背景是透明的,而不是白色,如果您想在插图画家中编辑图形,这可能很有用。最后,在我看来,刻面图看起来更好。

示例:

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

这是此代码生成的文件plot.png的样子: enter image description here

免责声明:我是包裹作者。

答案 3 :(得分:8)

我跟着Andrew's answer,但由于我的ggplot版本(v2.1.0)中存在错误,我还必须按照https://stackoverflow.com/a/35833548分别设置x和y轴。

而不是

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

我用过

theme(axis.line.x = element_line(color="black", size = 2),
    axis.line.y = element_line(color="black", size = 2))

答案 4 :(得分:1)

从上面的简化中可以看出,安德鲁的答案导致产生半边框的关键主题。

theme (panel.border = element_blank(),
       axis.line    = element_line(color='black'))

答案 5 :(得分:1)

以上选项不适用于使用speed date 54.72 1:33:56 49.37 1:33:59 37.03 1:34:03 24.02 7:39:58 28.02 7:40:01 24.04 7:40:04 24.02 7:40:07 25.35 7:40:10 26.69 7:40:13 32.04 7:40:16 28.02 11:05:43 30.71 11:05:46 29.36 11:05:49 18.68 11:05:52 54.72 11:05:55 34.69 10:31:34 25.03 10:31:38 56.04 10:31:40 44.03 10:31:43 sf创建的地图。因此,我想在此处添加相关的geom_sf()参数。这将创建一个漂亮的干净地图,仅显示功能。

ndiscr

答案 6 :(得分:0)

这是一个非常简单的答案

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

就这么简单。来源:this文章的结尾