2017-01-16 9 views
1

Я занимаюсь биоинформатикой, и мне нужно вывести график (barplot) с результатами родословной. Как правило, эти графики рисуются путем группировки популяций вместе. То, как это делается, состоит в том, что вы просто строите штрих-код оценки Q (данные ниже) для разных предполагаемых групп населения (здесь 4).Как «группировать» данные заказа в R для штрих-кода?

Проблема в том, что я использую ord = tbl[order(tbl$V1,tbl$V2,tbl$V3),] для сортировки значений. Таким образом, я вижу, что некоторые бары не группируются в нужную группу (см. Оранжевую полосу на графике, которая должна группироваться с первой группой). Таким образом, я хотел бы знать, как можно было бы группировать столбцы по цвету (который представляет собой совокупность).

Есть ли способ решить эту проблему?

barplotgeno <- function(tbl, # To plot the Q scores (ancestry). 
         col = c("#FF3030", # nice colors 
           "#9ACD31", 
           "#1D90FF", 
           "#FF8001"), 
         pdf = TRUE, 
         pdf.path.name = "~/Desktop/Stacked_barplot.pdf") { 

    ord = tbl[order(tbl$V1,tbl$V2,tbl$V3),] 

    if(pdf) { 
    pdf(pdf.path.name, width = 11, height = 8.5) 
    bp = barplot(t(as.matrix(ord[,1:dim(ord)[2]-1])), 
       space = c(0.2),#space = c(0),# Space between the bars 
       col=col, #rainbow(4), 
       xlab="Individual #", 
       ylab="Ancestry", xaxt="n", 
       border=NA, main = "Stacked barplot from ADMIXTURE analysis") 
    labs <- row.names(ord) 
    text(cex=0.5, x=bp+1, y=-0.03, labs, xpd=TRUE, srt=90, pos=2) 
    dev.off() 
    } else { 
    bp = barplot(t(as.matrix(ord[,1:dim(ord)[2]])), 
       space = c(0.2), 
       col=col, 
       xlab="Individual #", 
       ylab="Ancestry", xaxt="n", 
       border=NA, 
       main = "Stacked barplot from ADMIXTURE analysis") 
    labs <- row.names(ord) 
    text(cex=0.5, x=bp+1, y=-0.03, labs, xpd=TRUE, srt=90, pos=2) 
    } 
} 

# Example 
barplotgeno(tbl = tbl, pdf = FALSE) 

enter image description here

Вот данные:

tbl = structure(list(V1 = c(1e-05, 0.99997, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.430202, 0.99997, 
0.801974, 1e-05, 0.99997, 0.99997, 1e-05, 0.999968, 1e-05, 1e-05, 
1.3e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.99997, 1e-05, 1.8e-05, 
1e-05, 1.2e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1.1e-05, 1e-05, 0.642925, 
1e-05, 0.99997, 0.99997, 1e-05, 1e-05, 0.99997, 1e-05, 0.99997, 
0.99997, 0.287976, 1e-05, 0.99997, 0.99997, 0.99997, 1e-05, 0.533994, 
0.99997, 0.99997, 1e-05, 0.99997, 1e-05, 0.99997, 1e-05, 1e-05, 
0.99997, 0.99997, 1e-05, 1e-05, 1e-05, 1e-05, 0.307669, 0.99997, 
0.604114, 0.604792, 0.29646, 0.514252, 0.99997, 0.798616, 0.516577, 
1e-05, 1e-05, 1e-05, 1e-05, 0.449886, 1e-05, 1e-05, 1e-05, 1e-05, 
0.790272, 1e-05, 0.576786, 0.776731), V2 = c(0.99997, 1e-05, 
1e-05, 1e-05, 0.99997, 0.99997, 1e-05, 1e-05, 1e-05, 0.99997, 
0.99997, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1.2e-05, 0.99997, 1e-05, 1e-05, 1e-05, 0.99997, 1e-05, 
0.99997, 0.99997, 1e-05, 1e-05, 0.528138, 0.99997, 1e-05, 1e-05, 
1e-05, 1e-05, 0.99997, 1e-05, 0.99997, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.712004, 0.99997, 
1e-05, 1e-05, 1e-05, 0.99997, 0.465986, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.99997, 0.99997, 
0.99997, 0.99997, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.05777, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.591857, 0.99997, 1e-05, 
0.99997, 0.99997, 0.99997, 0.99997, 1e-05, 1e-05, 1e-05, 1e-05 
), V3 = c(1e-05, 1e-05, 1e-05, 0.541112, 1e-05, 1e-05, 0.329922, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.198006, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.999967, 0.451508, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.749225, 
1e-05, 0.99997, 0.99997, 1e-05, 1e-05, 1e-05, 1e-05, 0.442211, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.188, 
1e-05, 0.248756, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 0.395866, 0.395188, 0.293429, 0.427968, 
1e-05, 0.201364, 0.483403, 1e-05, 1e-05, 0.408123, 1e-05, 0.550094, 
1e-05, 1e-05, 1e-05, 1e-05, 0.209708, 0.533729, 0.423194, 0.223249 
), V4 = c(1e-05, 1e-05, 0.99997, 0.458868, 1e-05, 1e-05, 0.670058, 
0.99997, 0.99997, 1e-05, 1e-05, 0.99997, 0.99997, 0.569778, 1e-05, 
1e-05, 0.99997, 1e-05, 1e-05, 0.99997, 1e-05, 1e-05, 0.99997, 
1e-05, 0.548472, 1e-05, 0.99997, 1e-05, 1e-05, 1e-05, 0.99997, 
0.471833, 1e-05, 0.250753, 0.99997, 1e-05, 1e-05, 1e-05, 0.999969, 
1e-05, 0.357055, 0.557769, 1e-05, 1e-05, 0.99997, 0.99997, 1e-05, 
0.99997, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 0.81198, 1e-05, 0.751224, 1e-05, 0.99997, 
0.99997, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.692311, 
1e-05, 1e-05, 1e-05, 0.410101, 1e-05, 1e-05, 1e-05, 1e-05, 0.99997, 
0.99997, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
0.466251, 1e-05, 1e-05)), .Names = c("V1", "V2", "V3", "V4"), class = "data.frame", row.names = c(NA, 
-93L)) 

Если вам нужна группировка переменной здесь один (в порядке данных):

species = c("fuliginosa", "fuliginosa", "fuliginosa", "fuliginosa", "fuliginosa", 
"fuliginosa", "fuliginosa", "fuliginosa", "fuliginosa", "fortis", 
"fuliginosa", "fuliginosa", "fortis", "fortis", "fortis", "fuliginosa", 
"fuliginosa", "fortis", "scandens", "fortis", "fortis", "scandens", 
"scandens", "fuliginosa", "magnirostris", "scandens", "magnirostris", 
"fortis", "fortis", "fortis", "fortis", "fortis", "scandens", 
"fortis", "scandens", "scandens", "magnirostris", "fortis", "fortis", 
"fortis", "scandens", "magnirostris", "magnirostris", "fortis", 
"fortis", "fortis", "fortis", "magnirostris", "fortis", "magnirostris", 
"magnirostris", "magnirostris", "fortis", "fortis", "fortis", 
"magnirostris", "magnirostris", "fortis", "fortis", "fortis", 
"fortis", "fortis", "fortis", "fortis", "fortis", "fortis", "fortis", 
"magnirostris", "fortis", "fortis", "fortis", "fortis", "fortis", 
"fortis", "fortis", "fortis", "fortis", "fortis", "fuliginosa", 
"fortis", "fortis", "fortis", "fortis", "fuliginosa", "fuliginosa", 
"fuliginosa", "fuliginosa", "fortis", "fortis", "fortis", "fortis", 
"fortis", "fortis") 

ответ

1

Немного лучший способ:

library(tidyverse) 

plot_data <- tbl %>% 
    mutate(id = row_number()) %>% 
    gather('pop', 'prob', V1:V4) %>% 
    group_by(id) %>% 
    mutate(likely_assignment = pop[which.max(prob)], 
     assingment_prob = max(prob)) %>% 
    arrange(likely_assignment, desc(assingment_prob)) %>% 
    ungroup() %>% 
    mutate(id = forcats::fct_inorder(factor(id))) 

Участок с ggplot:

ggplot(plot_data, aes(id, prob, fill = pop)) + 
    geom_col() + 
    theme_classic() 

enter image description here

Или с фасеты:

ggplot(plot_data, aes(id, prob, fill = pop)) + 
    geom_col() + 
    facet_grid(~likely_assignment, scales = 'free', space = 'free') 

enter image description here

+0

Я предполагаю, что вы делаете, это назначить вероятность того ближайшего соседа, а затем сортировки в порядке убывания (скорее всего, менее всего вероятно). Я прав? –

+1

«назначьте вероятность быть ближайшим соседом», не уверен, что вы подразумеваете под этим. Я просто назначаю каждому индивидууму их наиболее вероятное население и сортирую его первым. (И затем сортируйте по вероятности, как вы отметили.) – Axeman

+0

Возможно, есть некоторые возможности для улучшения, также сортируя по 2-й и 3-й наиболее вероятные популяции. – Axeman

 Смежные вопросы

  • Нет связанных вопросов^_^