8

根据最近的更新,ggrepel现在支持hjustvjust. 根据文档,使用它应该对齐所有标签。但是,我无法让标签对齐,如下所示

在此处输入图像描述

我努力了

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

如何对齐这些标签?

编辑

我应该补充一点,它不仅要对齐标签,还要让它们彼此靠近,并使用不同长度的连接器来促进这一点。

4

3 回答 3

9

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

devtools::install_github("slowkow/ggrepel")

其次,我认为这仅适用于具有相同 x 值(for hjust)或 y 值(for 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')

在此处输入图像描述

# 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')

在此处输入图像描述

# 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')

在此处输入图像描述

于 2017-11-26T03:01:05.613 回答
5

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

此外,您的 、 和 似乎direction没有nudge_x关联nudge_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') 

在此处输入图像描述

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

在此处输入图像描述

direction = 'both', nudge_x = 0.1, 和nudge_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')

在此处输入图像描述

它似乎正在工作。我唯一注意到的是,由于 and 的限制, label似乎e受到限制,因此您可能希望进一步扩展轴,如下所示。xy-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))

在此处输入图像描述

于 2017-11-26T02:24:33.620 回答
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')

在此处输入图像描述

于 2017-11-26T03:38:13.153 回答