如何在画布的边界内制作geom_text图

时间:2013-06-21 17:36:57

标签: r text plot ggplot2

使用geom_text标记散点图的外围点。 根据定义,这些点往往靠近画布边缘:通常至少有一个单词与画布边缘重叠,使其无用。

显然,在下面的情况下,可以使用+ xlim(c(1.5, 4.5))

手动解决此问题
# test
df <- data.frame(word = c("bicycle", "tricycle", "quadricycle"),
                 n.wheels = c(2,3,4),
                 utility = c(10,6,7))
ggplot(data=df, aes(x=n.wheels, y=utility, label=word))  + geom_text() + xlim(c(1.5, 4.5))

trike

这不是理想的,因为

  1. 它不是自动化的,因此如果要生成许多绘图,则会减慢流程
  2. 这不准确,这意味着单词边缘与画布边缘之间的距离在每种情况下都不相等。
  3. 搜索这个问题没有找到任何解决方案,而且Hadley Wickham似乎满足于在ggplot2 help page中将标签切成两半(我知道Hadley,他们只是一个例子;)

4 个答案:

答案 0 :(得分:41)

ggplot 2.0.0hjustvjust引入了可能有助于裁剪的新选项,尤其是geom_text()。我们可以这样做:

"inward"

enter image description here

答案 1 :(得分:24)

我认为这对expand中的scale_continuous很有用:

ggplot(data=df, aes(x=n.wheels, y=utility, label=word))  + geom_text() + 
    scale_x_continuous(expand = c(.1, .1))

它可以填充数据(乘法和加法)来计算比例限制。除非你有很长的话,否则从默认值中略微提升它可能就足够了。有关详细信息和其他选项,请参阅?expand_scale,例如仅展开轴的上限或下限。从?expand_scale底部的示例来看,默认值对于离散尺度是加性0.6,对于连续尺度则是乘法0.05。

答案 2 :(得分:14)

您可以关闭剪裁。对于你的例子,它的效果非常好。

p <- ggplot(data=df, aes(x=n.wheels, y=utility, label=word))  + geom_text() 
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.draw(gt)

Clipping off

答案 3 :(得分:2)

我确信有人可以想出一种更快速编程的方法,但是这里的答案特别适用于所有具有不同范围的多个方面 - 我将data.frame修改为有两个方面不同的x和y尺度:

df <- data.frame(word = c("bicycle", "tricycle", "quadricycle"),
                 n.wheels = c(2,3,4, .2, .3, .4),
                 utility = c(10,6,7, 1, .6, .7),
                 facet = rep(c("one", "two"), each = 3))

然后,我创建一个虚拟数据框,确定每个方面的范围x和y的宽度(例如,diff(range(n.wheels))),将该宽度除以合适的数字(取决于标签的长度,我选择8),并将填充添加到每个方面的最小和最大x和y值:

pad <- rbind(ddply(df, .(facet), summarize,
             n.wheels = min(n.wheels) - diff(range(n.wheels))/8, 
             utility = min(utility) - diff(range(utility))/8),
ddply(df, .(facet), summarize,
             n.wheels = max(n.wheels) + diff(range(n.wheels))/8,
             utility = max(utility) + diff(range(utility))/8))
pad$word <- NA

然后,您可以将该图层添加到绘图中,颜色设置为NA:

ggplot(data=df, aes(x=n.wheels, y=utility, label = word))  + 
   geom_text() + 
   geom_point(data = pad, aes(x = n.wheels, y = utility), colour = NA) +
   facet_wrap(~facet, ncol = 1, scales = "free") 

结果:一个可重现的“自动化”绘图,没有截断标签(您可以稍后选择将刻度更改为更漂亮......)

Faceted ggplot with nice labels