ggplot2 - 在情节之外注释 [英] ggplot2 - annotate outside of plot

查看:24
本文介绍了ggplot2 - 在情节之外注释的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将样本大小值与图上的点相关联.我可以使用 geom_text 将数字定位在点附近,但这很麻烦.将它们沿着地块的外边缘排列起来会干净得多.

I would like to associate sample size values with points on a plot. I can use geom_text to position the numbers near the points, but this is messy. It would be much cleaner to line them up along the outside edge of the plot.

例如,我有:

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)

产生这个情节:

我更喜欢这样的东西:

我知道我可以创建第二个图并使用 grid.arrange(a la 这篇文章) 但确定 textGrobs 的间距与 y 轴对齐会很乏味.有没有更简单的方法来做到这一点?谢谢!

I know I can create a second plot and use grid.arrange (a la this post) but it would be tedious to determine the spacing of the textGrobs to line up with the y-axis. Is there an easier way to do this? Thanks!

推荐答案

您不需要绘制第二个绘图.您可以使用 annotation_custom 将 grobs 定位在绘图区域内外的任何位置.Grob 的定位是根据数据坐标进行的.假设5"、10"、15"与cat1"、cat2"、cat3"对齐,则 textGrobs 的垂直定位得到处理 - 您的三个 textGrobs 的 y 坐标由三个数据点的 y 坐标.默认情况下,ggplot2 将 grobs 剪辑到绘图区域,但剪辑可以被覆盖.需要扩大相关边际,为grob腾出空间.以下(使用 ggplot2 0.9.2)给出了一个类似于你的第二个图的图:

You don't need to be drawing a second plot. You can use annotation_custom to position grobs anywhere inside or outside the plotting area. The positioning of the grobs is in terms of the data coordinates. Assuming that "5", "10", "15" align with "cat1", "cat2", "cat3", the vertical positioning of the textGrobs is taken care of - the y-coordinates of your three textGrobs are given by the y-coordinates of the three data points. By default, ggplot2 clips grobs to the plotting area but the clipping can be overridden. The relevant margin needs to be widened to make room for the grob. The following (using ggplot2 0.9.2) gives a plot similar to your second plot:

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 - 在情节之外注释的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆