gpt4 book ai didi

R ggplot2 ggrepel - 在了解所有点的同时标记点的子集

转载 作者:行者123 更新时间:2023-12-01 17:33:21 24 4
gpt4 key购买 nike

我有一个相当密集的散点图,我正在使用 R 'ggplot2' 构建它,并且我想使用 'ggrepel' 来标记点的子集。我的问题是,我想绘制散点图中的所有点,但只用 ggrepel 标记一个子集,当我这样做时,ggrepel 在计算放置标签的位置时不会考虑图上的其他点,这导致到与绘图上其他点重叠的标签(我不想标记)。

这是说明该问题的示例图。

# generate data:
library(data.table)
library(stringi)
set.seed(20180918)
dt = data.table(
name = stri_rand_strings(3000,length=6),
one = rnorm(n = 3000,mean = 0,sd = 1),
two = rnorm(n = 3000,mean = 0,sd = 1))
dt[, diff := one -two]
dt[, diff_cat := ifelse(one > 0 & two>0 & abs(diff)>1, "type_1",
ifelse(one<0 & two < 0 & abs(diff)>1, "type_2",
ifelse(two>0 & one<0 & abs(diff)>1, "type_3",
ifelse(two<0 & one>0 & abs(diff)>1, "type_4", "other"))))]

# make plot
ggplot(dt, aes(x=one,y=two,color=diff_cat))+
geom_point()

plot without labels

如果我只绘制想要标记的点的子集,则 ggrepel 能够以相对于其他点和标签不重叠的方式放置所有标签。

ggplot(dt[abs(diff)>2 & (!diff_cat %in% c("type_3","type_4","other"))], 
aes(x=one,y=two,color=diff_cat))+
geom_point()+
geom_text_repel(data = dt[abs(diff)>2 & (!diff_cat %in% c("type_3","type_4","other"))],
aes(x=one,y=two,label=name))

plot labelled points only

但是,当我想同时绘制该数据子集和原始数据时,我得到带有标签的重叠点:

# now add labels to a subset of points on the plot
ggplot(dt, aes(x=one,y=two,color=diff_cat))+
geom_point()+
geom_text_repel(data = dt[abs(diff)>2 & (!diff_cat %in% c("type_3","type_4","other"))],
aes(x=one,y=two,label=name))

plot with labels

如何获取点子集的标签,使其不与原始数据中的点重叠?

最佳答案

您可以尝试以下操作:

  1. 为原始数据中的所有其他点分配一个空白标签 ( "" ),以便 geom_text_repel在相互排斥标签时将它们考虑在内;
  2. 增加box.padding默认参数 0.25更大的值,标签之间的距离更大;
  3. 增加 x 轴和 y 轴限制,以便在四个侧面为标签提供更多空间以进行排斥。

示例代码(带有 box.padding = 1 ):

ggplot(dt, 
aes(x = one, y = two, color = diff_cat)) +
geom_point() +
geom_text_repel(data = . %>%
mutate(label = ifelse(diff_cat %in% c("type_1", "type_2") & abs(diff) > 2,
name, "")),
aes(label = label),
box.padding = 1,
show.legend = FALSE) + #this removes the 'a' from the legend
coord_cartesian(xlim = c(-5, 5), ylim = c(-5, 5)) +
theme_bw()

plot

这是另一次尝试,box.padding = 2 :

plot 2

(注意:我使用的是 ggrepel 0.8.0。我不确定早期软件包版本是否提供所有功能。)

关于R ggplot2 ggrepel - 在了解所有点的同时标记点的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52397363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com