R ggplot2-在绘图外部进行注释

R ggplot2-在绘图外部进行注释,r,annotations,ggplot2,R,Annotations,Ggplot2,我想将样本大小值与绘图上的点相关联。我可以使用geom_text来定位点附近的数字,但这很混乱。沿着地块的外缘将它们排成一行会干净得多 例如,我有: df=data.frame(y=c("cat1","cat2","cat3"),x=c(12,10,14),n=c(5,15,20)) ggplot(df,aes(x=x,y=y,label=n))+geom_point()+geom_text(size=8,hjust=-0.5) 它生成了这个图: 我更喜欢这样的东西: 我知道我可以创建第

我想将样本大小值与绘图上的点相关联。我可以使用
geom_text
来定位点附近的数字,但这很混乱。沿着地块的外缘将它们排成一行会干净得多

例如,我有:

df=data.frame(y=c("cat1","cat2","cat3"),x=c(12,10,14),n=c(5,15,20))

ggplot(df,aes(x=x,y=y,label=n))+geom_point()+geom_text(size=8,hjust=-0.5)
它生成了这个图:

我更喜欢这样的东西:


我知道我可以创建第二个绘图并使用
网格。排列
(a la),但确定文本组的间距以与y轴对齐会很繁琐。有没有更简单的方法?谢谢

无需绘制第二个绘图。您可以使用
annotation\u custom
将GROB定位在打印区域内外的任何位置。grobs的定位是根据数据坐标进行的。假设“5”、“10”、“15”与“cat1”、“cat2”、“cat3”对齐,则会考虑textGrobs的垂直定位-三个textGrobs的y坐标由三个数据点的y坐标给出。默认情况下,
ggplot2
将剪切到打印区域,但可以覆盖剪切。相关利润率需要扩大,以便为集团创造空间。以下(使用ggplot2 0.9.2)给出了与第二个绘图类似的绘图:

library (ggplot2)
library(grid)

df=data.frame(y=c("cat1","cat2","cat3"),x=c(12,10,14),n=c(5,15,20))

p <- ggplot(df, aes(x,y)) + geom_point() +            # Base plot
     theme(plot.margin = unit(c(1,3,1,1), "lines"))   # Make room for the grob

for (i in 1:length(df$n))  {
p <- p + annotation_custom(
      grob = textGrob(label = df$n[i], hjust = 0, gp = gpar(cex = 1.5)),
      ymin = df$y[i],      # Vertical position of the textGrob
      ymax = df$y[i],
      xmin = 14.3,         # Note: The grobs are positioned outside the plot area
      xmax = 14.3)
 }    

# Code to override clipping
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.draw(gt)
库(ggplot2)
图书馆(网格)
df=数据帧(y=c(“cat1”、“cat2”、“cat3”),x=c(12,10,14),n=c(5,15,20))

p基于
网格的更简单解决方案

require(grid)

df = data.frame(y = c("cat1", "cat2", "cat3"), x = c(12, 10, 14), n = c(5, 15, 20))

p <- ggplot(df, aes(x, y)) + geom_point() + # Base plot
theme(plot.margin = unit(c(1, 3, 1, 1), "lines"))

p

grid.text("20", x = unit(0.91, "npc"), y = unit(0.80, "npc"))
grid.text("15", x = unit(0.91, "npc"), y = unit(0.56, "npc"))
grid.text("5", x = unit(0.91, "npc"), y = unit(0.31, "npc"))
require(网格)
df=data.frame(y=c(“cat1”、“cat2”、“cat3”),x=c(12,10,14),n=c(5,15,20))

p这在ggplot2 3.0.0中现在很简单,因为现在可以通过使用坐标函数中的
clip='off'
参数在绘图中禁用剪裁,例如
coord\u cartesian(clip='off')
coord\u fixed(clip='off')
。下面是一个例子

#生成数据

df这可以通过二次轴来完成,我认为它正在开发中。但是如果你想尝试一下,请点击这个链接,嗯,很有趣……我想知道哈德利是否会实现这个功能。但是,我在尝试加载
devtools
调用:if(!version\u match)时遇到了一些奇怪的错误{错误:参数长度为零。
。我只能说devtools适合我。如果您无法解决问题,您应该尝试发布一个问题。我通过从CRAN上的.zip安装ggplot2 0.9.2.1解决了这一问题。现在@LucianoSelzer在链接中提供的代码无法运行(导向轴的多个参数)。今晚可能太多了?我会睡一觉,看看明天早上我是否能弄明白。还有,在x=Inf,hjust>=1处有一个geom_文本层,然后关闭剪辑不是更容易吗?@jslefche,你应该注意到@baptiste提供的解决方案要简单得多。
p=p+geom_text(aes(label=n,x=Inf,y=y),hjust=-1)
。然后关闭剪切。虽然对齐可以稍微关闭。但是如何关闭剪切?@ThomasBrowne要关闭剪切,请参阅上面最后三行代码。不幸的是,您需要定位文本的x位置会随着x轴范围的变化而变化。因此,您需要使用一个相对于x轴的x值e轴范围。这是我的解决方案。我使用
xlim.range得到的x ggplot计算轴范围简单得多,乍一看,但是…字体与ggplot2默认值不匹配,因此您必须修改这些设置,并且由于使用npc单位,更难定位文本。结果可能同样复杂。对于方框pl的x轴,您如何做到这一点ot?这绝对是最简单的选择,谢谢!@ktyagi也许你现在已经对它进行了排序,但是你会使用完全相同的参数,但是指定
ylim
,或者
xlim
,为了完整性,
clip=off
也可以被称为@code>coord\u flip
(我假设也是coord\u x)。添加
coord\u笛卡尔坐标(clip='off')
对我来说不是一个解决方案,因为我需要
coord\u flip
。这是一个很好的观点,谢谢@LeroyTyrone。我刚刚更新了答案以反映这一点。值得注意的是,这似乎不适用于
coord\u polar