根据最新更新,ggrepel
现在支持hjust
和vjust
。根据{{3}},使用它应该对齐所有标签。但是,我无法让标签对齐,如下所示
我试过了
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')
如何对齐这些标签?
修改
我应该补充一点,它不仅仅是标签对齐,而是让它们彼此靠近,使用不同长度的连接器以便于实现。
答案 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')
# 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')
答案 1 :(得分:3)
根据文档(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')
似乎工作正常。我唯一注意到的是,由于e
和x
的限制,标签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))
答案 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')