如何置换data.frame列表并在ggplot2中创建带注释的堆栈条形图?(How to permute list of data.frame and create its annotated st

编程入门 行业动态 更新时间:2024-10-26 23:31:19
如何置换data.frame列表并在ggplot2中创建带注释的堆栈条形图?(How to permute list of data.frame and create its annotated stack bar plot in ggplot2?)

我有一个data.frame列表,需要先进行排列,并为每个data.frame创建带注释的堆栈栏图。 我已经在SO搜索了相关的文章,并且了解了如何去做。 然而,我给我的镜头如何做到这一点,如我所料,但我的代码是缓慢的,如果data.frame是相当大的,而不想要堆栈条绘图。 所以我不断阅读ggplot2的小插曲来获得解决方案。 我用所希望的方式对数据框架列表进行了置换。 如何排列data.frame列表并创建其注释的堆栈条图? 任何人都可以给我想法如何轻松高效地做到这一点? 如何操作data.frame列表并获取带注释的堆积条形图(观察数量,标签)? 提前致谢

可重现的data.frame:

confirmedDF <- list( bar = data.frame(begin=seq(2, by=11, len=25), end=seq(8, by=11, len=25), score=sample(54,25)), cat = data.frame(begin=seq(5, by=8, len=35), end=seq(9, by=8, len=35), score=sample(45,35)), foo = data.frame(begin=seq(8, by=13, len=25), end=seq(17, by=13, len=25), score=sample(49,25)) ) discardedDF <- list( bar = data.frame(begin=seq(3, by=12, len=40), end=seq(8, by=12, len=40), score=sample(72,40)), cat = data.frame(begin=seq(9, by=15, len=50), end=seq(17, by=15, len=50), score=sample(60,50)), foo = data.frame(begin=seq(21, by=19, len=30), end=seq(32, by=19, len=30), score=sample(42,30)) )

然后我的data.frame的输入列表:

library(tidyverse) library(magrittr) names(confirmedDF) <- paste("confirmed", names(confirmedDF), sep = ".") names(discardedDF) <- paste("discarded", names(discardedDF), sep = ".") merged <- do.call(rbind, c(confirmedDF, discardedDF)) merged %<>% rownames_to_column(var = "cn") merged %<>% separate(cn, c("list", "letters", "seq"), sep = "\\.") merged %<>% mutate(stringency = ifelse(score >= 12, "Stringent", "Weak")) res <- merged %>% split(list(.$letters, .$stringency, .$list))

我试图获得每个单独的堆栈条图,代码如下:

library(dplyr) library(ggplot2) lapply(res, function(ele_) { plot_data <- ele_ %>% group_by(sample, stringency, list) %>% tally %>% group_by(sample, stringency) %>% mutate(percentage = n / sum(n), cumsum = cumsum(percentage)) ggplot(data = plot_data, aes(x = sample, y= n ,fill = stringency)) + geom_bar(position = "dodge",stat = "identity") })

我不明白用lapply来得到每个小节的情节是非常缓慢和低效的。 以上琐碎的代码并没有给我想要的酒吧情节。 我如何优化代码? 如何排列data.frame列表并获取其注释的条形图?

如何实现我想要的输出堆栈条形图? 任何想法 ?

I have list of data.frame that needed to be permuted first and create annotated stack bar plot for each data.frame. I have searched related post in SO and got some idea how to do it. However, I gave my shot how to make this as I expected, but my code is slow if data.frame is rather big, while getting stack bar plot is not desired. So I am continously reading ggplot2' vignette to get solution. I am stucked with permuting data.frame list in desired way. How can I permute list of data.frame and create its annotated stack bar plot ? Can anyone give me idea how to do this easily and efficiently ? How to manipulate list of data.frame and get annotated stacked bar plot(number of observation, label) ? Thanks in advance

reproducible data.frame :

confirmedDF <- list( bar = data.frame(begin=seq(2, by=11, len=25), end=seq(8, by=11, len=25), score=sample(54,25)), cat = data.frame(begin=seq(5, by=8, len=35), end=seq(9, by=8, len=35), score=sample(45,35)), foo = data.frame(begin=seq(8, by=13, len=25), end=seq(17, by=13, len=25), score=sample(49,25)) ) discardedDF <- list( bar = data.frame(begin=seq(3, by=12, len=40), end=seq(8, by=12, len=40), score=sample(72,40)), cat = data.frame(begin=seq(9, by=15, len=50), end=seq(17, by=15, len=50), score=sample(60,50)), foo = data.frame(begin=seq(21, by=19, len=30), end=seq(32, by=19, len=30), score=sample(42,30)) )

then my input list of data.frame :

library(tidyverse) library(magrittr) names(confirmedDF) <- paste("confirmed", names(confirmedDF), sep = ".") names(discardedDF) <- paste("discarded", names(discardedDF), sep = ".") merged <- do.call(rbind, c(confirmedDF, discardedDF)) merged %<>% rownames_to_column(var = "cn") merged %<>% separate(cn, c("list", "letters", "seq"), sep = "\\.") merged %<>% mutate(stringency = ifelse(score >= 12, "Stringent", "Weak")) res <- merged %>% split(list(.$letters, .$stringency, .$list))

my attempt to get each individual stack bar plot, trivial code as follows :

library(dplyr) library(ggplot2) lapply(res, function(ele_) { plot_data <- ele_ %>% group_by(sample, stringency, list) %>% tally %>% group_by(sample, stringency) %>% mutate(percentage = n / sum(n), cumsum = cumsum(percentage)) ggplot(data = plot_data, aes(x = sample, y= n ,fill = stringency)) + geom_bar(position = "dodge",stat = "identity") })

I don't understand using lapply to get each bar plot is quite slow and inefficient. above trivial code didn't give my desired bar plot. How can I optimize the code? How to permute list of data.frame and getting its annotated bar plot ?

How can I achieve my desired output stack bar plot ? Any idea ?

最满意答案

你可以试试这个:

res %>% bind_rows %>% group_by(stringency, list, sample) %>% tally %>% ungroup %>% setNames(c("var", "val", "sample", "n")) %>% {bind_rows(., setNames(., c("val", "var", "sample", "n")))} %>% ggplot(aes(x=var, y=n, fill=val)) + geom_col() + geom_text(aes(label=n), position=position_stack(vjust = 0.5)) + facet_wrap(~sample)

在这里输入图像描述

You could try this:

res %>% bind_rows %>% group_by(stringency, list, sample) %>% tally %>% ungroup %>% setNames(c("var", "val", "sample", "n")) %>% {bind_rows(., setNames(., c("val", "var", "sample", "n")))} %>% ggplot(aes(x=var, y=n, fill=val)) + geom_col() + geom_text(aes(label=n), position=position_stack(vjust = 0.5)) + facet_wrap(~sample)

enter image description here

更多推荐

本文发布于:2023-08-06 11:08:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1448882.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:堆栈   并在   注释   列表   条形图

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!