R 标记ggplot循环中的前10%值

R 标记ggplot循环中的前10%值,r,ggplot2,R,Ggplot2,更新 我把问题缩小到循环I。因为如果我只是在下面的代码中使用一个特定的列(“b”),它就可以工作。有人知道i有什么问题,为什么循环不起作用吗 我有一个很大的数据集,我在其中循环多个列来创建图形。我想在图中为I标记最上面的10%点(然后是最下面的10%)。我已经尝试了很多,但不知道如何只标注热门歌曲。标签名称应与“标签”列相对应 在这个例子中,我尝试了gghighlight,但它不起作用 ##加载包 图书馆(“ggplot2”) 图书馆(“purrr”) 图书馆(“GGBeeSarm”) 图书馆(

更新 我把问题缩小到循环I。因为如果我只是在下面的代码中使用一个特定的列(“b”),它就可以工作。有人知道i有什么问题,为什么循环不起作用吗

我有一个很大的数据集,我在其中循环多个列来创建图形。我想在图中为I标记最上面的10%点(然后是最下面的10%)。我已经尝试了很多,但不知道如何只标注热门歌曲。标签名称应与“标签”列相对应

在这个例子中,我尝试了gghighlight,但它不起作用

##加载包
图书馆(“ggplot2”)
图书馆(“purrr”)
图书馆(“GGBeeSarm”)
图书馆(“gghighlight”)
##创建数据

小组可能以下内容符合问题要求。
它首先重新格式化数据,然后以面绘制所有长方体和胡须图。
要点是使用
ggrepel::geom_label_repel
将标签放置在远离点的位置

library(tidyverse)
library(ggplot2)
library(ggrepel)

df2 <- df %>%
  select(-event) %>%
  gather(key, value, -group, -label, -color) %>%
  group_by(group, key) %>%
  mutate(flag = value >= quantile(value, 0.9, type = 2))

g <- ggplot(df2, aes(x = group, y = value, color = color)) + 
  geom_boxplot(show.legend = FALSE) + 
  scale_color_manual(values= c("Control"="#107f40", "PAD with event" = "#D85622", "PAD without event"="#2D416D")) +
  geom_point(data = df2 %>% filter(flag), show.legend = FALSE) +
  geom_label_repel(data = df2 %>% filter(flag) %>% unique(), 
             aes(label = label),
             color = "black") +
  facet_wrap(~ key)

g
库(tidyverse)
图书馆(GG2)
图书馆(ggrepel)
df2%
选择(-event)%%>%
聚集(键、值、-组、-标签、-颜色)%>%
分组依据(组,键)%>%
变异(标志=值>=分位数(值,0.9,类型=2))
g%过滤器(标志),show.legend=FALSE)+
几何图形标签排斥(数据=df2%>%filter(flag)%>%unique(),
aes(标签=标签),
color=“黑色”)+
面_包裹(~key)
G

数据创建代码。 我重新发布问题中的代码,通过设置RNG种子使其可复制

set.seed(1234)    # Make the results reproducible

group <- c("Control","PAD","Control","PAD","PAD", "Control","PAD","Control","PAD","PAD", "Control","PAD","Control","PAD","PAD")
label <- 1:15
b <- round(runif(15, 1, 7)) 
c <- round(runif(15, 1, 3)) 
d <- round(runif(15, 3, 8)) 
e <- round(runif(15, 1, 5))
event <- c("no event", "event" , "no event" , "no event" , "no event", "no event", "event", "no event", "no event" , "no event" , "no event" , "no event", "no event", "event", "event")

df <- data.frame(group, label, b,c,d, e, event)
df

rm(group, label, b, c, d, e, event)

df$color <- "color"
for (i in 1:dim(df)[1]){
  if (df$group[i]=="Control") {
    df$color[i] <- "Control" 
  }
  if (df$group[i] == "PAD" && df$event[i] == "event") {
    df$color[i] <- "PAD with event" 
  }
  if (df$group[i] == "PAD" && df$event[i] == "no event") {
    df$color[i] <- "PAD without event"
  }
}
set.seed(1234)#使结果重现

第1组)代码中不使用变量
expl
response
。2) 您不需要加载
库(ggbeeswarm)
库(gghighlight)
。3) 在循环内部,
g已调整。我确实有标签,但它们是错误的标签。我希望“标签”列作为标签,而不是“组”。此外,我只希望最热门的歌曲被标注。你在gghighlight中有一个输入错误:
lable
应该是
label
你是对的。但代码中没有包含该错误。问题仍然存在,这部分解决了问题。实际上还有一个问题,那就是:我必须循环190多列。有没有一种方法可以循环使用它们并将绘图保存在多个页面上?有了这段代码,我只能循环列,但它将它们添加到一个网格中?一个网格中的190个图形当然是unreadable@JensPosma有一个函数
ggforce::facet_grid_paginate
和另一个函数
ggforce::n_pages
来确定所需的页数。尝试一下,如果你有任何问题,发表评论。
pdf("labels_test.pdf", width = 15)
for(i in 1:42) {
print(ggplot(df2, aes(x = event, y = value, color = color)) + 
  geom_boxplot(show.legend = FALSE) + 
  scale_color_manual(values= c("PAD with event" = "#D85622", "PAD without event"="#2D416D")) +
  geom_point(data = df2 %>% filter(flag), show.legend = FALSE) +
  geom_label_repel(data = df2 %>% filter(flag) %>% unique(), 
                   aes(label = Study_no),
                   color = "black") +
  facet_wrap_paginate(~ key, ncol = 2, nrow = 2, page = i))
}
dev.off()