簡體   English   中英

如何在ggplot2中置換data.frame列表並創建其帶注釋的堆棧條形圖?

[英]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列表並獲取帶注釋的堆疊條形圖(觀察數,標簽)? 提前致謝

可復制的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列表並獲取帶注釋的條形圖?

如何獲得所需的輸出堆棧條形圖? 任何想法 ?

您可以嘗試以下方法:

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) 

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM