首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggrepel改变片段

ggrepel改变片段
EN

Stack Overflow用户
提问于 2020-06-09 08:30:57
回答 1查看 1.6K关注 0票数 0

尝试用抖动点向我的点添加标签。我用pos定义了位置,用geom_label代替了跳抖动。这样做很有效,但这样做的目的是在我的一些观点中添加标签。我使用geom_text_repel (也尝试过geom_label_repel),但没有得到适当的标签。正如您在我的图中所看到的,这些片段正在做一些奇怪的事情,特别是对于PDAC104。选择从标签到点(准确到点,而不是像这里这样的距离)的片段是什么?我尝试了不同的填充物选择,但没有设法让东西起作用。

谢谢,

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2020-06-09 14:41:34

这很有趣--谢谢你的问题。您的代码和对您的绘图的方法不是这里的罪魁祸首,而是将position_jitter()应用于dataset的方式。从position_jitter()创建的对象基本上可以看作是一个抖动值数组,该数组逐行应用于您的数据集。请注意,我不太确定这是否真的是发生了什么,但行为符合这种工作方式。

确定问题

这是怎么回事?首先,让我创建一个虚拟数据集作为示例。

代码语言:javascript
复制
set.seed(1234)
df <- data.frame(x=1:10, y=rnorm(10))

我将绘制数据集,并将预先创建的position_jitter()对象应用于geom_point()geom_text_repel()。您将看到输出图中的所有段都与所期望的点匹配。

代码语言:javascript
复制
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()应用于该数据集的子集(这基本上是您自己的情况),问题就变得很明显。

代码语言:javascript
复制
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是如何工作的假设。如果我们的假设是正确的,那么前几行应该是可以的,但是对于最后几行,抖动将是不同的。让我们来检验一下:

代码语言:javascript
复制
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()使用的数据集,另一个是“所有其他东西”。

至少,有一种识别“其他一切”的好方法,那就是使用来自dplyrdplyr。以下是解决办法:

代码语言:javascript
复制
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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62278263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档