Заказ сложенного барплота на основе нескольких значений - PullRequest
1 голос
/ 15 апреля 2020

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

У меня есть набор данных, из которого я Я строю сгруппированный барплот, и я не хочу знать, как я могу организовать сгруппированный барплот, где «похожие» люди объединяются. Я работаю в биоинформатике, и вот набор данных, который представляет собой матрицу d-by-n. В этом наборе данных игрушек имеется d = 10 популяций предков и n = 5 особей:

 > a
            V1          V2          V3           V4           V5
1  0.534410243 0.009358740 0.011295181 0.2141751740 0.0030129254
2  0.026653603 0.372426720 0.447847534 0.0179177507 0.4072904477
3  0.193317915 0.003605024 0.003186611 0.4832114736 0.0007095471
4  0.111881585 0.000000000 0.000000000 0.2296213741 0.0119233461
5  0.089696570 0.591163629 0.509774416 0.0032542030 0.5535847030
6  0.007543558 0.000000000 0.000000000 0.0364907757 0.0013148362
7  0.004862942 0.000000000 0.002123909 0.0146682272 0.0004053690
8  0.009276195 0.011710457 0.014367894 0.0000000000 0.0000000000
9  0.006903171 0.004314528 0.011404455 0.0000000000 0.0126889937
10 0.015454219 0.007420903 0.000000000 0.0006610215 0.0090698319

Все столбцы составляют до 1. Я создаю столбчатую диаграмму в виде столбцов:

pop <- rownames(a)
a <- a %>% mutate(pop = rownames(a))
a_long <- gather(a, key, value, -pop)

# trying to create a similarity index
a_long <- a_long %>% group_by(key) %>% 
  mutate(mean = mean(value)) %>%
  arrange(desc(mean))

# looking at some of the expanded dataset
> a_long[1:20,]
# A tibble: 20 x 4
# Groups:   key [2]
   pop   key      value  mean
   <chr> <chr>    <dbl> <dbl>
 1 1     V2    0.00936    0.1
 2 2     V2    0.372      0.1
 3 3     V2    0.00361    0.1
 4 4     V2    0          0.1
 5 5     V2    0.591      0.1
 6 6     V2    0          0.1
 7 7     V2    0          0.1
 8 8     V2    0.0117     0.1
 9 9     V2    0.00431    0.1
10 10    V2    0.00742    0.1
11 1     V4    0.214      0.1
12 2     V4    0.0179     0.1
13 3     V4    0.483      0.1
14 4     V4    0.230      0.1
15 5     V4    0.00325    0.1
16 6     V4    0.0365     0.1
17 7     V4    0.0147     0.1
18 8     V4    0          0.1
19 9     V4    0          0.1
20 10    V4    0.000661   0.1

# colors
v_colors <- c("#440154FF", "#443B84FF", "#34618DFF", "#404588FF", "#1FA088FF", "#40BC72FF",
              "#67CC5CFF", "#A9DB33FF", "#DDE318FF", "#FDE725FF")

plot <- ggplot(a_long, aes(x = key, y = value, fill = pop)) 
plot + geom_bar(position="stack", stat="identity") +  scale_fill_manual(values = v_colors)

Результат выглядит следующим образом: enter image description here

Как сделать так, чтобы результат выглядел более аккуратно, например, если лица с более высокой долей происхождения населения находятся рядом друг с другом на ось х? До сих пор я пытался вычислить «среднее» значение каждого человека, но это не сработало, поскольку это не очень хорошая мера. Как я могу создать индекс сходства, который говорит мне, насколько индивидуум 1 похож на индивидуума 2, а затем, как мне упорядочить его по оси X, чтобы они выглядели хорошо сгруппированными (например, как столбцы в на этом рисунке )?

Спасибо!

И последнее: если вы хотите заново создать набор данных a, вот код:

v1 = c(0.534410243, 0.026653603, 0.193317915, 0.111881585, 0.089696570, 0.007543558, 0.004862942, 0.009276195, 0.006903171, 0.015454219)
v2 = c(0.009358740, 0.372426720, 0.003605024, 0.000000000, 0.591163629, 0.000000000, 0.000000000, 0.011710457, 0.004314528, 0.007420903)
v3 = c(0.011295181, 0.447847534, 0.003186611, 0.000000000, 0.509774416, 0.000000000, 0.002123909, 0.014367894, 0.011404455, 0.000000000) 
v4 = c(0.2141751740, 0.0179177507, 0.4832114736, 0.2296213741, 0.0032542030, 0.0364907757, 0.0146682272, 0.0000000000, 0.0000000000, 0.0006610215)
v5 = c(0.0030129254, 0.4072904477, 0.0007095471, 0.0119233461, 0.5535847030, 0.0013148362, 0.0004053690, 0.0000000000, 0.0126889937, 0.0090698319)
a = data.frame(V1 = v1, V2 = v2, V3 = v3, V4 = v4, V5 = v5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...