как переупорядочить оси графика с датой - PullRequest
1 голос
/ 24 февраля 2020

У меня есть эти две данные:

1.table_range

"code";"sp";"min";"max"
"EI12";"EI";2015-06-01;2015-08-01
"EI21";"EI";2015-01-01;2018-11-01
"EI25";"EI";2019-03-01;2019-03-01
"EI26";"EI";2019-03-01;2020-02-01
"EI27";"EI";2019-10-01;2019-11-01
"EI30";"EI";2016-01-01;2018-05-01
"EI35";"EI";2017-09-01;2017-12-01
"EI38";"EI";2017-02-01;2019-11-01
"EI43";"EI";2018-08-01;2019-01-01
"EI44";"EI";2018-04-01;2018-04-01
"EI45";"EI";2018-09-01;2020-01-01
"EI7";"EI";2014-05-01;2016-04-01
"EI9";"EI";2012-12-01;2015-03-01

2.table_sum

"mes_ano";"code";"sp";"count"
2012-12-01;"EI9";"EI";"1"
2014-05-01;"EI7";"EI";"1"
2015-01-01;"EI21";"EI";"1"
2015-03-01;"EI9";"EI";"1"
2015-06-01;"EI12";"EI";"1"
2015-08-01;"EI12";"EI";"1"
2016-01-01;"EI30";"EI";"2"
2016-04-01;"EI7";"EI";"1"
2016-09-01;"EI21";"EI";"1"
2016-09-01;"EI30";"EI";"1"
2017-01-01;"EI30";"EI";"2"
2017-02-01;"EI38";"EI";"1"
2017-09-01;"EI35";"EI";"1"
2017-10-01;"EI21";"EI";"1"
2017-11-01;"EI21";"EI";"1"
2017-12-01;"EI35";"EI";"1"
2018-02-01;"EI21";"EI";"1"
2018-04-01;"EI21";"EI";"1"
2018-04-01;"EI30";"EI";"1"
2018-04-01;"EI44";"EI";"2"
2018-05-01;"EI21";"EI";"1"
2018-05-01;"EI30";"EI";"1"
2018-07-01;"EI21";"EI";"1"
2018-08-01;"EI43";"EI";"3"
2018-09-01;"EI43";"EI";"1"
2018-09-01;"EI45";"EI";"1"
2018-10-01;"EI21";"EI";"1"
2018-11-01;"EI21";"EI";"1"
2018-11-01;"EI43";"EI";"1"
2019-01-01;"EI43";"EI";"3"
2019-03-01;"EI25";"EI";"2"
2019-03-01;"EI26";"EI";"1"
2019-05-01;"EI38";"EI";"1"
2019-07-01;"EI26";"EI";"1"
2019-08-01;"EI26";"EI";"1"
2019-10-01;"EI27";"EI";"1"
2019-11-01;"EI26";"EI";"1"
2019-11-01;"EI27";"EI";"1"
2019-11-01;"EI38";"EI";"1"
2019-12-01;"EI45";"EI";"1"
2020-01-01;"EI45";"EI";"2"
2020-02-01;"EI26";"EI";"1"

и этот график

lin_temp <- ggplot(data = table_sum, aes(x = mes_ano, y = code)) +
  geom_segment(data = table_range, size = 1.2, alpha= 0.8,
               aes(x = min, xend = max, y = code, yend = code))+
  geom_point(aes(shape = , color=count), size=2)

когда я делаю график, линии смешиваются и не в последовательности, как это https://i.ibb.co/LgQY838/1.png

Я использовал это Как вы конкретно заказываете ось ggplot2 x вместо алфавитного заказать? чтобы отсортировать ось y вручную следующим образом https://i.ibb.co/DfLSwMJ/2.png

Существует более быстрый способ сортировки по дате, поскольку у меня более 100 кодов?

1 Ответ

2 голосов
/ 24 февраля 2020

Вы можете использовать информацию о дате, чтобы ggplot мог выполнить сортировку. Вам нужно только указать R, что столбец code является упорядоченным коэффициентом.

Мы проверяем правильность сортировки при извлечении уровней:

code_levels <- table_range[order(table_range$min), "code"]

Затем мы используем упорядоченные уровни, когда мы делаем code с коэффициентом:

table_range$code <- factor(table_range$code, levels=code_levels )

Редактировать:

Добавить пример:

MRE:

table_range <- structure(list(code = structure(c(4L, 3L, 11L, 12L, 13L, 5L, 7L, 6L, 9L, 8L, 10L, 2L, 1L), .Label = c("EI9", "EI7", "EI21", "EI12", "EI30", "EI38", "EI35", "EI44", "EI43", "EI45", "EI25", "EI26", "EI27"), class = "factor"),
                              sp = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "EI", class = "factor"), 
                              min = structure(c(16587, 16436, 17956, 17956, 18170, 16801, 17410, 17198, 17744, 17622, 17775, 16191, 15675), class = "Date"), 
                              max = structure(c(16648, 17836, 17956, 18293, 18201, 17652,  17501, 18201, 17897, 17622, 18262, 16892, 16495), class = "Date")),
                         row.names = c(NA, -13L), class = "data.frame")

table_sum <- structure(list(mes_ano = structure(c(15675, 16191, 16436, 16495, 16587, 16648, 16801, 16892, 17045, 17045, 17167, 17198, 17410, 17440, 17471, 17501, 17563, 17622, 17622, 17622, 17652, 17652, 17713, 17744, 17775, 17775, 17805, 17836, 17836, 17897, 17956, 17956, 18017, 18078, 18109, 18170, 18201, 18201, 18201, 18231, 18262, 18293), class = "Date"),
                            code = structure(c(13L, 12L, 2L, 13L, 1L, 1L, 6L, 12L, 2L, 6L, 6L, 8L, 7L, 2L, 2L, 7L, 2L, 2L, 6L, 10L, 2L, 6L, 2L, 9L, 9L, 11L, 2L, 2L, 9L, 9L, 3L, 4L, 8L, 4L, 4L, 5L, 4L, 5L, 8L, 11L, 11L, 4L), .Label = c("EI12", "EI21", "EI25", "EI26", "EI27", "EI30", "EI35", "EI38", "EI43", "EI44", "EI45", "EI7", "EI9"), class = "factor"),
                            sp = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "EI", class = "factor"),
                            count = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L,   2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 3L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,   2L, 1L), .Label = c("1", "2", "3"), class = "factor")),
                       row.names = c(NA, -42L), class = "data.frame")

Изготовление заказанного коэффициента:

code_levels <- table_range[order(table_range$min), "code"]
table_range$code <- factor(table_range$code, levels=code_levels)

Воспроизводящий сюжет:

library(ggplot2)
ggplot(data = table_sum, aes(x = mes_ano, y = code)) +
geom_segment(data = table_range, size = 1.2, alpha= 0.8,
             aes(x = min, xend = max, y = code, yend = code))+
geom_point(aes(shape = , color=count), size=2)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...