【问题标题】:How to jitter/remove overlap for geom_text labels如何抖动/删除 geom_text 标签的重叠
【发布时间】:2017-03-25 08:55:01
【问题描述】:

在图中,是否可以稍微抖动一下状态缩写标签,使它们不重叠?如果我使用check_overlap = TRUE,那么它会删除一些重叠的观察结果,我不希望这样。我也不想要geom_label_repel,因为它的标签突出并穿过我包含的 45 度线(我不想发生这种情况)

这是我的代码的相关部分供参考:

ggplot(df, aes(x = huff_margin_dem, y = margin16dem_state, label = abbrev)) +
  geom_abline(intercept = 0) +
  geom_text(fontface = "bold")

【问题讨论】:

  • 没有reproducible code 是不可能直接帮助你的。但是,您应该更仔细地查看ggrepel 以寻找标签移动的控制。

标签: r ggplot2 geom-text


【解决方案1】:

你试过position=position_jitter()吗?您可以根据自己的选择调整widthheight

ggplot(df, aes(x = huff_margin_dem, y = margin16dem_state, label = abbrev)) +
  geom_abline(intercept = 0) +
  geom_text(fontface = "bold",position=position_jitter(width=1,height=1))

编辑 仅操作某个标签的示例

+geom_text(fontface = "bold",
position=position_jitter(width=ifelse(df$abbrev=='KS',1,0),
      height=ifelse(df$abbrev=='KS',1,0)))

或多个标签

df$jit<-with(df, ifelse(abbrev == "KS" | abbrev == "LA", 1, 2))

+geom_text(fontface = "bold",
    position=position_jitter(width=df$jit,height=df$jit))

【讨论】:

  • 谢谢你!您是否碰巧知道是否有办法抖动特定文本而不仅仅是所有文本?例如,在上面的图像示例中,有没有办法用“KS”和“LA”文本来抖动观察结果而不是其他观察结果?
【解决方案2】:

只是想我会指出ggrepel::geom_text_repel 会做你所追求的。考虑到您示例中的某些文本已经与该行重叠,我认为您不喜欢的可能是geom_label_repellabel 部分,因为它会放置在您的文本后面,从而阻塞了该行。

使用您的示例:

ggplot(df) +
  geom_text_repel(aes(x = huff_margin_dem, 
                      y = margin16dem_state, 
                      label = abbrev))

【讨论】:

  • 同意!尽管 ggplot() 中的美学可能更容易理解,就像其他示例一样:ggplot(df, aes(x = huff_margin_dem, y = margin16dem_state, label = abbrev)) + geom_text_repel()
  • 在我的实验中,ggrepel::geom_text_repel 在整齐地呈现非重叠标签方面比操纵 position=position_jitter() 的参数做得更好,后者出现在之前的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多