如何在ggplot2绘图中去除纵向网格线?

101

我正在制作一张柱状图,其中的柱子足以表示水平(x)位置,因此我希望避免绘制多余的垂直网格线。

我了解如何在opts()中设置次要和主要网格线的样式,但我无论如何都无法强制抑制只有垂直网格线。

library(ggplot2)

data <- data.frame(x = 1:10, y = c(3,5,2,5,6,2,7,6,5,4))

ggplot(data, aes(x, y)) +
  geom_bar(stat = 'identity') +
  opts(
    panel.grid.major = theme_line(size = 0.5, colour = '#1391FF'),
    panel.grid.minor = theme_line(colour = NA),
    panel.background = theme_rect(colour = NA),
    axis.ticks = theme_segment(colour = NA)
  )

目前看来,我可能需要抑制所有网格线,然后使用geom_hline()重新绘制它们,这似乎有点麻烦(而且不太清楚如何找到刻度/主要网格线位置以用于传递给geom_hline())。

如果有任何想法,将不胜感激!

5个回答

210
自从 ggplot2 0.9.2 版本开始,使用 "主题"(themes)实现这个目标变得容易多了。你现在可以分别为 panel.grid.major.x 和 panel.grid.major.y 分配不同的主题,如下所示。
#   simulate data for the bar graph
data <- data.frame( X = c("A","B","C"), Y = c(1:3) )    

#   make the bar graph
ggplot( data  ) +
    geom_bar( aes( X, Y ) ) +
    theme( # remove the vertical grid lines
           panel.grid.major.x = element_blank() ,
           # explicitly set the horizontal lines (or they will disappear too)
           panel.grid.major.y = element_line( size=.1, color="black" ) 
    )

这个例子的结果看起来相当丑陋,但它演示了如何在保留水平线和x轴刻度线的情况下去除垂直线。


2
也许需要更新一下:它给了我一个“错误:stat_count()不能与y美学一起使用”的提示。 - gaspar
1
截至2020年6月19日,错误仍然存在。此解决方案目前无法工作。 - Meg
1
@Meg 不确定您是否还在寻找解决方案,但我在这里发现了 ggExtra 库中的 removeGrid:rdrr.io removeGrid,可以删除网格线,同时保留坐标轴标签。 - SHKT

35

尝试使用

scale_x_continuous(breaks = NULL)

这将移除所有垂直网格线以及X轴刻度标签。


10
可以了,但是正如你指出的,现在我没有x轴标签了,而我需要它们——你有什么想法可以重新添加它们吗? - Tarek
18
新版本说明:“请使用breaks = NULL来删除比例尺中的断点。(已弃用; 最后使用于版本0.8.9)” - Stat-R
1
当x变量是离散的时,应使用scale_x_discrete(breaks = NULL) - luchonacho
5
当我想要标签但不想要分页时,这个方法不起作用。 - groceryheist
1
@groceryheist 不确定你是否还在寻找解决方案,但我在这里发现 ggExtra 库中的 removeGrid 函数可以移除网格线,同时保留轴标签。rdrr.io removeGrid - SHKT

6

选项1:

data_df <- data.frame(x = 1:10, y = c(3,5,2,5,6,2,7,6,5,4))

ggplot(data_df, aes(x, y)) +
  geom_bar(stat = 'identity') +
  theme(panel.background = element_rect(fill = "white"))

选项2:

data_df <- data.frame(x = 1:10, y = c(3,5,2,5,6,2,7,6,5,4))
    
ggplot(data_df, aes(x, y)) +
      geom_bar(stat = 'identity') +
      theme(
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank()
      )

在我看来,这个版本似乎是最佳实践。 - glenn_in_boston

4
这将使您只剩下数据点:
ggplot(out, aes(X1, X2)) + 
    geom_point() + 
    scale_x_continuous(breaks = NULL) + 
    scale_y_continuous(breaks = NULL) + 
    opts(panel.background = theme_blank()) + 
    opts(axis.title.x = theme_blank(), axis.title.y = theme_blank())

也许这需要更新。当我运行它时,我会收到以下错误信息:Error in opts(panel.background = theme_blank()) : could not find function "opts"请注意,此答案还未遵循 OP 的可重现答案,该答案使用了 "data"(而非 "out")以及 "x" 和 "y"(而非 "X1" 和 "X2")。 - Meg

2

将我的答案从相关线程中复制过来:

对于在2020年查询的人,我发现可以使用ggExtra库中的removeGrid函数解决此问题,该库在rdrr.io > removeGrid上有介绍。

经过测试,在ggplot2版本3.3.0和ggExtra版本0.9上可用,可以使轴标记没有网格线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接