ggplot 中的躲避/替换/排斥轴刻度标签?

Ben*_*ker 5 r ggplot2

如果没有大量工作,我想要的可能是不可能的,但也许有人有解决方案。我有一个如下图(当然这是一个过于简单的示例),其中我的刻度标签彼此非常接近:

dd <- data.frame(x=1:4, y=c(-10,10.5,10.6,10.7),
                 z = LETTERS[1:4])
library(ggplot2)
gg1 <- ggplot(dd, aes(x,y)) +
  geom_point() +
  geom_segment(x=0, aes(xend=x, y=y, yend=y)) +
  scale_y_continuous(breaks=dd$y, labels=dd$z)
Run Code Online (Sandbox Code Playgroud)

三个刻度标签(B、C、D)重叠的绘图

如果我真的想要,我可以导出为 SVG,将其转储到 Inkscape 中,然后手动将标签分开(甚至添加连接标签与精确 y 轴位置的小指示线):

B、C、D 手动移位的图片

如果能够以编程方式/自动执行类似的操作,那就太好了。我想:

  • ggrepel包(仅适用于图中的标签/文本 AFAIK)
  • directlabels包(它有一些放置选项,例如“first.bumpup”,可能适合这种情况/可修改)
  • 此处所示的n.dodge参数check.overlap看起来有用且有趣,它们几乎可以处理这种情况,但会水平避开标签,如果标签长于几个字符,这会变得难看......guide_axisn.dodge

我很高兴有一个label.pos.nudge参数可以手动指定,以将标签沿轴的位置从相应的位置移开

Ben*_*ker 6

感谢查看这个问题的建议(这个问题让我知道了coord_cartesian(clip = "off"),我做了以下工作(请注意,我必须在上面的基本示例中更改geom_segment(x=0, ...)geom_segment(x=-Inf, ...),以便关闭剪辑不会把事情弄乱)。

gg1 + coord_cartesian(clip = "off") +
  theme(axis.text.y = element_blank(),
        plot.margin = margin(t=5.5, r=5.5, b=5.5, l=30, unit="pt")) +
  geom_text_repel(x = 0.85, aes(label = z, y = y),
                  direction = "y",
                  force_pull = 100,
                  hjust = -7,
                  xlim = c(0.8,1))
Run Code Online (Sandbox Code Playgroud)

具有排斥点的图

geom_text_repel请注意,这可能需要对情节边距和( forceforce_pullhjust、等)的参数进行大量的处理xlim才能使其看起来正确......我仍然没有按照我想要的方式得到我的真实情节,但是越来越近了。x(这里和值可能hjust是多余的......)