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