完全删除 facet_wrap 标签

123

我想完全删除分面的标签,以创建一种 sparkline 效果,因为对于观众来说,标签是无关紧要的,我能想到的最好方法是:

library(MASS)
library(ggplot2)
qplot(week,y,data=bacteria,group=ID, geom=c('point','line'), xlab='', ylab='') + 
     facet_wrap(~ID) + 
     theme(strip.text.x = element_text(size=0))

那么我能够完全摆脱(现在是空白的)strip.background,以便为“火花线”腾出更多空间吗?

或者说,有没有更好的方法来实现这种"火花线"效果,适用于像这样大量二进制时间序列数据?

4个回答

186
对于ggplot v2.1.0或更高版本,请使用element_blank()来删除不需要的元素:
library(MASS) # To get the data
library(ggplot2)

qplot(
  week,
  y,
  data = bacteria,
  group = ID,
  geom = c('point', 'line'),
  xlab = '',
  ylab = ''
) + 
facet_wrap(~ ID) + 
theme(
  strip.background = element_blank(),
  strip.text.x = element_blank()
)

在这种情况下,您要删除的元素称为strip

ggplot2 figure without panel titles


使用ggplot grob布局的替代方案

在旧版本的ggplot(v2.1.0之前)中,条带文本占据gtable布局中的行。 element_blank会删除文本和背景,但不会删除该行占用的空间。
此代码从布局中删除了这些行:
library(ggplot2)
library(grid)

p <- qplot(
  week,
  y,
  data = bacteria,
  group = ID,
  geom = c('point', 'line'),
  xlab = '',
  ylab = ''
) + 
facet_wrap(~ ID)

# Get the ggplot grob
gt <- ggplotGrob(p)

# Locate the tops of the plot panels
panels <- grep("panel", gt$layout$name)
top <- unique(gt$layout$t[panels])

# Remove the rows immediately above the plot panel
gt = gt[-(top-1), ]

# Draw it
grid.newpage()
grid.draw(gt)

还有其他人收到“apply(strip_mat, 1, max_height)中的错误:X的维数必须具有正长度”吗? - PatrickT
在第一个示例中,如果您的分面标签沿着y轴,则可以概括并将strip.text.x替换为strip.text - Freddie J. Heather

29
Sorry, 我只能用英文回答你的问题。
ggplot() ... + 
opts(strip.background = theme_blank(), strip.text.x = theme_blank())

你现在使用

ggplot() ... + 
theme(strip.background = element_blank(), strip.text = element_blank())

欲了解更多详情,请参见http://docs.ggplot2.org/current/theme.html


10

从Sandy的更新答案中可以看出,可能由于ggplot的更新已经过时了?根据我所知,以下代码(Sandy原始答案的简化版本)可以重现Sean原始图形而不会产生任何额外的空间:

library(ggplot2)
library(grid)
qplot(week,y,data=bacteria,group=ID, geom=c('point','line'), xlab='', ylab='') + 
 facet_wrap(~ID) + 
 theme(strip.text.x = element_blank())

我正在使用ggplot 2.0.0。


4
据我所知,Sandy的回答是正确的,但我认为值得一提的是,在没有子图的情况下和移除了子图的情况下,绘图的宽度似乎有一点小差异。
如果你使用Wickham在他的书中推荐的视口布局来堆叠图形,这个差异就会变得显而易见,但如果不仔细观察,可能并不明显。

1
你能举个例子详细说明吗? - mnel
我们开始吧--请尝试链接。我使用了ggplot的“diamonds”数据集,所以它适用于任何人。请注意,分面图的右边缘略窄于未分面的图形。 - CW Dillon
这不是一个好的比较,因为它从facet_wrap(在OP的问题中,面板在顶部)切换到facet_grid(带有侧面板测试)。关键问题是面板文本是不可压缩的:如果您调整OP问题中qplot的窗口大小,您可以轻松地看到面板文本可能引起的问题。由于x轴通常具有先前已知的值,而y轴通常具有先前未知的值,因此这特别不幸。 - MattBagg

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