124

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

7 回答 7

162

编辑 忽略这个答案。现在有更好的答案。见评论。采用+ theme_classic()

编辑

这是一个更好的版本。原始帖子中下面提到的错误仍然存​​在(我认为)。但轴线是在面板下方绘制的。因此,删除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()) 

在此处输入图像描述

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

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

极值点被剪裁,但可以使用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)
于 2012-06-02T11:57:18.903 回答
80

最近对 ggplot (0.9.2+) 的更新已经彻底改变了主题的语法。最值得注意的是,opts()现在已弃用,已被theme(). Sandy 的回答仍会(截至 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'))

生成:

绘图输出

于 2013-01-31T15:27:19.173 回答
26

一个替代方案是cowplottheme_classic()附带的主题(随包自动加载)。它看起来类似于,但有一些细微差别。最重要的是,默认标签尺寸更大,因此生成的数字可以在出版物中使用而无需进一步修改(特别是如果您使用而不是保存它们)。此外,背景是透明的,而不是白色,如果您想在 illustrator 中编辑图形,这可能很有用。最后,在我看来,多面图看起来更好。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这段代码生成的文件的样子: 在此处输入图像描述

免责声明:我是包作者。

于 2015-07-06T01:28:26.203 回答
8

我遵循了Andrew 的回答,但由于我的 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))
于 2016-07-09T09:57:31.833 回答
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
于 2018-09-20T14:02:48.430 回答
2

从上面的安德鲁的回答中进行的简化导致了这个关键主题来生成半边框。

theme (panel.border = element_blank(),
       axis.line    = element_line(color='black'))
于 2018-07-06T23:09:12.090 回答
2

这是一个非常简单的答案

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

就这么容易。来源:本文结尾

于 2020-03-29T05:59:15.047 回答