将标签与ggrepel对齐

时间:2017-11-26 01:32:03

标签: r ggplot2 ggrepel

根据最新更新,ggrepel现在支持hjustvjust。根据{{​​3}},使用它应该对齐所有标签。但是,我无法让标签对齐,如下所示

documentation

我试过了

library(tidyverse)
library(ggrepel)

df <- data.frame(x=seq(1:5), y=seq(1:5), label=letters[seq(1:5)])

ggplot(df, aes(x=x, y=y)) +
  geom_point() +
  geom_text_repel(aes(label=label),
                  force=1, point.padding=unit(1,'lines'),
                  hjust=0,
                  direction='y',
                  nudge_x=0.1,
                  segment.size=0.2) +
  geom_smooth(method='lm')

如何对齐这些标签?

修改

我应该补充一点,它不仅仅是标签对齐,而是让它们彼此靠近,使用不同长度的连接器以便于实现。

3 个答案:

答案 0 :(得分:5)

首先,据我所知,这仅在开发版本中可用。所以你需要从github安装它:

devtools::install_github("slowkow/ggrepel")

其次,我认为这仅适用于具有相同x值(对于hjust)或y值(对于vjust)的数据点。

示例:

library(tidyverse)
library(ggrepel)

df <- data.frame(x=seq(1:5), y=3, label=letters[seq(1:5)])

# not aligned
ggplot(df, aes(x=x, y=y)) +
  geom_point() +
  geom_text_repel(aes(label=label),
                  force=1, point.padding=unit(1,'lines'),
                  # vjust=0,
                  direction='y',
                  nudge_x=0.1,
                  segment.size=0.2) +
  geom_smooth(method='lm')

enter image description here

# aligned bottom
ggplot(df, aes(x=x, y=y)) +
  geom_point() +
  geom_text_repel(aes(label=label),
                  force=1, point.padding=unit(1,'lines'),
                  vjust=0,
                  direction='y',
                  nudge_x=0.1,
                  segment.size=0.2) +
  geom_smooth(method='lm')

enter image description here

# aligned top
ggplot(df, aes(x=x, y=y)) +
  geom_point() +
  geom_text_repel(aes(label=label),
                  force=1, point.padding=unit(1,'lines'),
                  vjust=1,
                  direction='y',
                  nudge_x=0.1,
                  segment.size=0.2) +
  geom_smooth(method='lm')

enter image description here

答案 1 :(得分:3)

根据文档(https://cran.r-project.org/web/packages/ggrepel/vignettes/ggrepel.html),CRAN上的当前版本(hjust)不支持0.7.0

此外,您的directionnudge_xnudge_y似乎没有关联。

我将您的代码稍微更改为以下三个版本。

direction = 'y'nudge_y = 0.1

ggplot(df, aes(x=x, y=y)) +
  geom_point() +
  geom_text_repel(aes(label=label),
                  force=1, point.padding=unit(1,'lines'),
                  direction = 'y',
                  nudge_y = 0.1,
                  segment.size=0.2) +
  geom_smooth(method='lm') 

enter image description here

direction = 'x'nudge_x = 0.1

ggplot(df, aes(x=x, y=y)) +
  geom_point() +
  geom_text_repel(aes(label=label),
                  force=1, point.padding=unit(1,'lines'),
                  direction = 'x',
                  nudge_x = 0.1,
                  segment.size=0.2) +
  geom_smooth(method='lm')

enter image description here

direction = 'both'nudge_x = 0.1nudge_y = 0.3

ggplot(df, aes(x=x, y=y)) +
  geom_point() +
  geom_text_repel(aes(label=label),
                  force=1, point.padding=unit(1,'lines'),
                  direction = 'both',
                  nudge_x = 0.1,
                  nudge_y = 0.3,
                  segment.size=0.2) +
  geom_smooth(method='lm')

enter image description here

似乎工作正常。我唯一注意到的是,由于ex的限制,标签y-axis似乎受到限制,因此您可能希望进一步扩展轴,如下所示。

ggplot(df, aes(x=x, y=y)) +
  geom_point() +
  geom_text_repel(aes(label=label),
                  force=1, point.padding=unit(1,'lines'),
                  direction = 'y',
                  nudge_y = 0.1,
                  segment.size=0.2) +
  geom_smooth(method='lm') +
  scale_y_continuous(limits = c(1, 5.5))

enter image description here

答案 2 :(得分:2)

不确定你的目标到底是什么。如果你想要一面的所有标签,可能更容易手动绘制它们而不是使用ggrepel。

df <- data.frame(x=seq(1:5), y=seq(1:5), label=letters[seq(1:5)])

ggplot(df, aes(x = x, y = y)) +
  geom_point() +
  geom_text(aes(x = max(x) + 0.1, y = y, label=label), hjust = 0, vjust = 0.5) +
  geom_segment(aes(x = x + 0.04, xend = max(x) + 0.06, y = y, yend = y), size = 0.2) +
  geom_smooth(method='lm')

enter image description here