ggplot2分面边距

9
我使用facet_wrap来绘制一些数据。以下是一个示例:
library (ggplot2)
library (reshape)

# generate some dummy data
x = seq(0,1,0.05)
precision = sqrt(x)
recall    = 1 - precision
fmeasure  = 2 * (precision * recall) / (precision + recall)

# prepare it for plotting
df = data.frame(x=x, precision=precision, recall=recall, fmeasure=fmeasure)
df = melt(df, id.vars=c(x))

# plot it
p = ggplot(df, aes(x=x, y=value, group=variable))
p = p + geom_line() + facet_wrap(~variable, ncol=3)
p = p + coord_cartesian(xlim=c(0,1), ylim=c(0,1)) # second plot is without this line
print (p)

图1:上述代码的绘图。 带有xlim和ylim的绘图

然而,从图1中可以看出,相邻分面的第一个和最后一个标签重叠。可以通过增加分面之间的空间来解决此问题。另一种选择是删除xlimylim范围,如图2所示,但这会在分面本身保留不必要的空间。

图2:删除线p = p + coord_cartesian(xlim=c(0,1), ylim=c(0,1))后的绘图。 没有xlim和ylim的绘图

我尝试增加分面之间的空间,但到目前为止还没有成功。你有什么建议吗?

我使用的是ggplot2版本0.9.1。


对于0.9.1版本,请使用 p + opts(panel.margin = unit(2, "lines")),但是你会有很多额外的空白区域,并且在我的看法中会失去一些分面效果(注意0.9.2现在使用theme而不是opts)。 - Tyler Rinker
我把它作为答案扔了下来。不确定那是否是你想要的。 - Tyler Rinker
@Tyler Rinker。是的,这就是我要找的答案。谢谢! - Timo
2个回答

11

对于0.9.1版本,使用:p + opts(panel.margin = unit(2, "lines")),但会有很多额外的空白区域,并且在分面效果上可能会失去一些效果(请注意,0.9.2现在使用theme代替opts)。

多年来,ggplot2的API已经发生了变化。截至2018-02-01,这是更新后的解决方案:

p + theme(panel.spacing = unit(2, "lines"))

4
panel.margin已被弃用(2.2.1),请改用panel.spacing - tjebo

1

在Tyler的回答基础上,您可以使用strip.text主题参数进一步压缩分面面板,如下所示:

library(tidyverse)

mpgTidy <- pivot_longer(mpg, c(cty, hwy), names_to="mpg_categ", values_to="mpg")

g <- ggplot(mpgTidy, aes(x=displ, y=mpg, color=factor(cyl))) +
  facet_wrap(~ mpg_categ) +
  geom_point()

g

enter image description here

g + theme(strip.text=element_text(margin=margin()),
          panel.spacing=unit(0, "lines"))

enter image description here

这种情况下,当分面标签很长或包含换行符,并且分面图具有行和列时,它会非常有用。

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