从ggplot2中删除网格,背景色以及上下边框


103

我想通过使用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())

3
如以下评论中所述,现在可以使用+ theme_classic()
nsheff 2014年

Answers:


133

编辑 忽略此答案。现在有更好的答案。查看评论。用+ 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()) 

在此处输入图片说明

原始帖子 这很接近。出现了一个axis.line无法在y轴上工作的错误(请参阅此处),该错误似乎尚未修复。因此,在删除面板边框后,必须使用分别绘制y轴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

极端点被裁剪,但是可以使用baptiste的代码撤消裁剪。

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

在此处输入图片说明

或用于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)

76

ggplot(0.9.2+)的最新更新已彻底修改了主题的语法。最明显的是,opts()现在已弃用,已由替换theme()桑迪的答案仍会(截至2012年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'))

产生:

绘图输出


33
或更简单?ggplot(df,aes(x = a,y = b))+ geom_point()+ theme_classic()
user20650 2013年

使用ggplot2 2.1.0时,这两种方法都不适合我... @wkretzsch的答案很好。
新星

25

另一种选择theme_classic()cowplot软件包随附的主题theme_cowplot()(随该软件包自动加载)。它看起来与相似theme_classic(),但有一些细微的差别。最重要的是,默认标签尺寸较大,因此生成的图形可以在出版物中使用,而无需进一步修改(特别是如果您使用save_plot()而不是保存它们时ggsave())。此外,背景是透明的,而不是白色,如果您要在Illustrator中编辑图形,则背景可能有用。最后,我认为多面图看起来更好。

例:

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这段代码生成的文件如下所示: 在此处输入图片说明

免责声明:我是程序包的作者。


8

我遵循了安德鲁的回答,但由于我的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))

3

上述选项不适用于使用sf和创建的地图geom_sf()。因此,我想在ndiscr此处添加相关参数。这将创建一个漂亮的干净地图,仅显示功能。

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

1

从上述答案的简化可以看出,这个关键主题产生了半边框。

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

0

这是一个非常简单的答案

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

就这么简单。来源:结束文章

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.