我想将样本大小值与绘图上的点相关联。我可以使用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)


此图:


我更喜欢这样的东西:


我知道我可以创建第二个图并使用grid.arrange(a la),但要确定textGrob的间距与y轴对齐会很麻烦。有没有更简单的方法可以做到这一点?谢谢!

评论

这可以通过我认为正在开发的辅助轴来完成。但是,如果您想尝试一下,请遵循以下链接groups.google.com/forum/?fromgroups=#!topic/ggplot2/_3Pm-JEoCqE

嗯,很有趣...我想知道哈德利是否要实现这一目标。但是,尝试加载devtools时出现了一些奇怪的错误:call:if(!version_match){error:参数长度为零。

我只能说devtools对我有用。如果无法解决问题,则应尝试发布问题。

我通过从CRAN上的.zip安装ggp​​lot2 0.9.2.1来解决此问题。现在,@ LucianoSelzer链接中提供的代码无法运行(guide_axis的多个参数)。今晚也许太多了?我会睡在上面,看看早上是否无法解决

另请参见stackoverflow.com/a/17493256/471093

#1 楼

您无需绘制第二个图。您可以使用annotation_custom将grob放置在绘图区域内或外的任何位置。齿轮的定位是根据数据坐标进行的。假设“ 5”,“ 10”,“ 15”与“ cat1”,“ cat2”,“ cat3”对齐,则考虑了textGrobs的垂直位置-三个textGrobs的y坐标由三个数据点的y坐标。默认情况下,ggplot2将笔迹剪辑到绘图区域,但可以覆盖剪辑。需要扩大相关的余量,以便为grob腾出空间。以下内容(使用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)




评论


在x = Inf处有一个geom_text层,正好大于等于1,然后关闭剪辑会更容易吗?

–baptiste
2012年9月14日上午8:35

@jslefche,您应该注意,@ baptiste提供的解决方案要简单得多。 p = p + geom_text(aes(label = n,x = Inf,y = y),正好= -1)。然后关闭剪辑。虽然对齐可能会略有偏离。

–桑迪·穆斯普拉特(Sandy Muspratt)
2012年9月14日20:36在

以及如何关闭剪辑?

–托马斯·布朗(Thomas Browne)
2014年11月19日,11:03



@ThomasBrowne要关闭剪辑,请参见上面的最后三行代码。

–桑迪·穆斯普拉特(Sandy Muspratt)
2015年3月31日,下午3:31

不幸的是,您需要放置文本的x位置随x轴的范围而变化。因此,您需要使用相对于轴范围的x值。这是我的解决方案。我用xlim.range <-ggplot_build(plot)$ panel $ ranges [[1]] $ x.range得到x ggplot计算的轴范围。然后,我将其用作x位置:x = xlim.range [1]-diff(xlim.range)/ 10并且它起作用了!

–巴卡堡
2015年12月5日,19:23

#2 楼

ggplot2 3.0.0现在很简单,因为现在可以通过在坐标函数(例如clip = 'off'coord_cartesian(clip = 'off'))中使用coord_fixed(clip = 'off')参数在绘图中禁用裁剪。下面是一个示例。

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

    # Create the plot
    ggplot(df,aes(x=x,y=y,label=n)) +
      geom_point()+
      geom_text(x = 14.25, # Set the position of the text to always be at '14.25'
                hjust = 0,
                size = 8) +
      coord_cartesian(xlim = c(10, 14), # This focuses the x-axis on the range of interest
                      clip = 'off') +   # This keeps the labels from disappearing
      theme(plot.margin = unit(c(1,3,1,1), "lines")) # This widens the right margin
 




评论


如何为箱形图的x轴执行此操作?

– ktyagi
18/12/7在10:33

这绝对是最简单的选择,谢谢! @ktyagi也许您现在已经对此进行了排序,但是您将使用完全相同的参数,但是指定ylim或xlim

–EcologyTom
19年2月4日在11:07

为了完整起见,clip = off也可以称为@ coord_flip(我也假定为coord_x)。对我来说,添加coord_cartesian(clip ='off')不是解决方案,因为我需要coord_flip。

–乐华泰隆
3月1日23:00



很好,谢谢@LeroyTyrone。我只是更新了答案以反映这一点。

–bschneidr
3月3日,0:52

值得注意的是,这似乎不适用于coord_polar

– MokeEire
7月29日,1:12

#3 楼

基于grid的Simplier解决方案

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"))


评论


乍看之下要简单得多,但是...字体与ggplot2的默认设置不匹配,因此您必须摆弄这些设置,并且由于使用npc单位而更难放置文本。可能最终变得同样复杂。

–Mooks
18年4月23日在11:35