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

我想通过使用 ggplot2重现下面的情节。我可以接近,但不能删除顶部和右边框。下面我介绍了几种使用 ggplot2的尝试,包括在 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())
267175 次浏览

忽略这个答案。现在有更好的答案了。看看评论。使用 + theme_classic()

剪辑

这个版本更好。下面原文中提到的 bug 仍然存在(我认为)。但是轴线是画在面板下面的。因此,移除 panel.borderpanel.background以查看轴线。

library(ggplot2)
a <- seq(1,20)
b <- a^0.25
df <- data.frame(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 轴(看这里) ,这似乎还没有得到修复。因此,在移除面板边框之后,必须使用 geom_vline分别绘制 y 轴。

library(ggplot2)
library(grid)


a <- seq(1,20)
b <- a^0.25
df <- data.frame(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

极端点被剪切,但是剪切可以通过 施洗者代码撤消。

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)

最近对 ggplot (0.9.2 +)的更新彻底改进了主题的语法。最值得注意的是,opts()已经被 theme()所取代,现在已经被废弃了。桑迪的的答案仍然会(从1月12日开始)生成一个图表,但是会导致 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

theme_classic()的一个替代品是 牛仔密谋theme_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

免责声明: 我是包作者。

我遵循 安德鲁的回答,但是由于 ggplot (v2.1.0)版本中的 bug,我还必须遵循 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))

从上面 Andrew 的答案简化到这个生成半边框的关键主题。

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

上述选项不适用于用 sfgeom_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

这是一个非常简单的答案

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

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

你也可以检查 panel.background

 theme(
panel.background = element_rect(fill = "black"),
panel.grid.major = element_blank(), panel.grid.minor = element_blank()