Почему порядок строк тепловой карты не совпадает с порядком строк данных? - PullRequest
1 голос
/ 30 мая 2020

Привет для моей работы, я создаю тепловую карту ggplot2.

вот данные

structure(list(label = structure(c(4L, 5L, 7L, 2L, 3L, 6L, 8L, 
1L, 4L, 5L, 7L, 2L, 3L, 6L, 8L, 1L, 4L, 5L, 7L, 2L, 3L, 6L, 8L, 
1L), .Label = c("SP1", "SP2", "SP3", "SP4", "SP5", "SP6", "SP7", 
"SP8"), class = "factor"), Categories = structure(c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L), .Label = c("VAR1", "VAR2", "VAR3"), class = "factor"), 
    Value = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 3L, 
    3L, 3L, 3L, 2L, 1L, 1L, 2L, 3L, 3L, 3L, 3L, 3L, 1L, 1L), .Label = c("<NA>", 
    "A", "B"), class = "factor")), class = "data.frame", row.names = c(NA, 
-24L))

как вы можете видеть, есть определенный c порядок меток:

1 - SP4
2 - SP5
3 - SP7
...
7 - SP8
8 - SP1

вот df:

> table
   label Categories Value
1    SP4       VAR1  <NA>
2    SP5       VAR1  <NA>
3    SP7       VAR1  <NA>
4    SP2       VAR1  <NA>
5    SP3       VAR1  <NA>
6    SP6       VAR1  <NA>
7    SP8       VAR1  <NA>
8    SP1       VAR1  <NA>
9    SP4       VAR2     A
10   SP5       VAR2     B
11   SP7       VAR2     B
12   SP2       VAR2     B
13   SP3       VAR2     B
14   SP6       VAR2     A
15   SP8       VAR2  <NA>
16   SP1       VAR2  <NA>
17   SP4       VAR3     A
18   SP5       VAR3     B
19   SP7       VAR3     B
20   SP2       VAR3     B
21   SP3       VAR3     B
22   SP6       VAR3     B
23   SP8       VAR3  <NA>
24   SP1       VAR3  <NA>

поэтому я ожидаю увидеть то же row order, если я сделаю тепловую карту с ggplot, но вместо этого я получаю такой порядок:

enter image description here

Я использовал код:

ggplot(mod_mat_gen_env, aes(x=Categories, y=label))+
  geom_tile(aes(fill=Value)) 

1 Ответ

1 голос
/ 30 мая 2020

Один из вариантов - рефакторинг в вашем data.frame, или вы можете указать порядок, используя опцию limits= в scale_y_discrete()

df$Value = replace(as.character(df$Value),df$Value=="<NA>",NA)
list_correct_order=c("SP4","SP5","SP7","SP2","SP3","SP6","SP8","SP1")

ggplot(df, aes(x=Categories, y=label))+
  geom_tile(aes(fill=Value)) +
scale_y_discrete(limits=rev(list_correct_order))

enter image description here

...