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