尝试用抖动点向我的点添加标签。我用pos定义了位置,用geom_label代替了跳抖动。这样做很有效,但这样做的目的是在我的一些观点中添加标签。我使用geom_text_repel (也尝试过geom_label_repel),但没有得到适当的标签。正如您在我的图中所看到的,这些片段正在做一些奇怪的事情,特别是对于PDAC104。选择从标签到点(准确到点,而不是像这里这样的距离)的片段是什么?我尝试了不同的填充物选择,但没有设法让东西起作用。
谢谢,
我
my.label <- stat_ind_pi1_ok %>% filter(Pop1=="Is" | ID=="PDAC64")
pos <- position_jitter(width = 0.2, seed=1)
Plot_pi1_indPop <- stat_ind_pi1_ok %>% filter(Pop1=="bla" | Pop1=="ME" | Pop1=="Nafr" | Pop1=="Is") %>%
ggplot(aes(x = Pop1, y = mean_pi_pc, colour = Pop1)) +
geom_point(position = pos, alpha=0.35, size=2) +
geom_text_repel(data=my.label, mapping=aes(label=ID), position=pos, label.size = NA, fill = NA, size=3,
max.overlaps = Inf, min.segment.length=0, box.padding=0.5, label.padding=0, point.padding=0) +
stat_summary(fun = mean, geom = "point", size = 5) +
coord_flip() +
scale_color_hue() +
labs(x = NULL, y = "Pi (%)") +
theme_light() +
theme(
legend.position = "none",
axis.title = element_text(size = 12),
axis.text.x = element_text(size = 10),
panel.grid = element_blank()
) ; Plot_pi1_indPop

我
发布于 2020-06-09 14:41:34
这很有趣--谢谢你的问题。您的代码和对您的绘图的方法不是这里的罪魁祸首,而是将position_jitter()应用于dataset的方式。从position_jitter()创建的对象基本上可以看作是一个抖动值数组,该数组逐行应用于您的数据集。请注意,我不太确定这是否真的是发生了什么,但行为符合这种工作方式。
确定问题
这是怎么回事?首先,让我创建一个虚拟数据集作为示例。
set.seed(1234)
df <- data.frame(x=1:10, y=rnorm(10))我将绘制数据集,并将预先创建的position_jitter()对象应用于geom_point()和geom_text_repel()。您将看到输出图中的所有段都与所期望的点匹配。
pos <- position_jitter(width=0.5, seed=1)
ggplot(df, aes(x,y)) + geom_point(position=pos) +
geom_text_repel(aes(label=x), color='red', position=pos, force=20)

如果我们将geom_point()应用于整个数据集,但将geom_text_repel()应用于该数据集的子集(这基本上是您自己的情况),问题就变得很明显。
df_rep <- df %>% dplyr::filter(x > 5)
ggplot(df, aes(x,y)) + geom_point(position=pos) +
geom_text_repel(data=df_rep, aes(label=x), color='red', position=pos, force=20)

现在分段没有排列,这就是你所观察到的。这里的关键是要理解,pos根本没有链接到用于绘图的数据集。如果您认为它是一个数字向量,在绘制之前被乘以x美学,那么这种行为就有点道理了。整个数据集中的第一个观察被调整的值与子集中的第一个集合所调整的值相同,但这意味着特定的观测不会以相同的方式抖动,除非它们在两个数据集中处于相同的顺序。我们可以通过创建一个由来自pos的前几行和来自df的最后几行组成的数据集来检验df是如何工作的假设。如果我们的假设是正确的,那么前几行应该是可以的,但是对于最后几行,抖动将是不同的。让我们来检验一下:
df_rep2 <- df[c(1:3, 8:10),] # choosing first few and last few obs in df
ggplot(df, aes(x,y)) + geom_point(position=pos) +
geom_text_repel(data=df_rep2, aes(label=x), color='red', position=pos, force=20)

现在应该非常清楚,为什么这些线的位置与示例中的点不同。
如何解决这个问题
那么解决办法是什么呢?我们知道,pos需要以相同的顺序应用于geom_point()和geom_text_repel()对象。我希望有一种更优雅的方法来做到这一点(也许还有),但是您可以避免使用两个单独的geom_point()调用:一个是匹配geom_text_repel()使用的数据集,另一个是“所有其他东西”。
至少,有一种识别“其他一切”的好方法,那就是使用来自dplyr的dplyr。以下是解决办法:
df_not <- anti_join(df, df_rep) # find everything in df that is not df_rep
ggplot(df, aes(x,y)) +
geom_point(data=df_not, position=pos) +
geom_point(data=df_rep, position=pos) +
geom_text_repel(data=df[which(df$x>5),], aes(label=x), color='red', position=pos, force=20)

https://stackoverflow.com/questions/62278263
复制相似问题