Группируйте самые низкие значения и сортируйте этот график - PullRequest
1 голос
/ 03 октября 2019

У меня есть временной ряд производства в разных странах. Я сделал этот график с областями с полными данными:

Production for each country over time

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

Вот подмножество данных

structure(list(country = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L), .Label = c("Democratic People's Republic of Korea", 
"Democratic Republic of the Congo", "Dominica", "Dominican Republic", 
"Ecuador", "Egypt", "El Salvador", "Eswatini", "Fiji", "France", 
"French Guiana"), class = "factor"), year = c(1961, 1962, 1963, 
1964, 1965, 1966, 1967, 1968, 1969, 1970, 1961, 1962, 1963, 1964, 
1965, 1966, 1967, 1968, 1969, 1970, 1961, 1962, 1963, 1964, 1965, 
1966, 1967, 1968, 1969, 1970, 1961, 1962, 1963, 1964, 1965, 1966, 
1967, 1968, 1969, 1970, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 
1968, 1969, 1970, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 
1969, 1970, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 
1970, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 
1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1961, 
1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1961, 1962, 
1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970), value = c(1.245, 
1.305, 1.43, 1.505, 1.315, 1.465, 1.365, 1.32, 1.62, 1.61, 0.37, 
0.36, 0.35, 0.35, 0.35, 0.39, 0.41, 0.425, 0.43, 0.4281, 0.00013, 
0.00013, 0.00014, 0.00014, 0.00015, 0.00015, 0.00016, 0.00016, 
0.00016, 0.00016, 0.050233, 0.048464, 0.045583, 0.043198, 0.0375, 
0.0425, 0.038548, 0.04, 0.043, 0.045, 0.153047, 0.138365, 0.191953, 
0.12878, 0.191363, 0.174905, 0.227769, 0.173892, 0.211189, 0.256067, 
1.61713, 2.00369, 1.867, 1.934212, 2.141, 2.376, 2.167, 2.3, 
2.368, 2.397, 0.1763, 0.2139, 0.207077, 0.191611, 0.203006, 0.265914, 
0.20884, 0.25755, 0.278967, 0.363078, 0.029991, 0.03486, 0.031751, 
0.030481, 0.031751, 0.035017, 0.062595, 0.051709, 0.058107, 0.062595, 
0.00022, 0.00022, 0.00025, 4e-04, 4e-04, 4e-04, 0.001996, 0.00375, 
0.002, 0.000711, 2.48, 1.86656, 3.87707, 2.1088, 3.4678, 4.3402, 
4.15219, 5.38958, 5.73, 7.491, 2e-04, 0.000405, 7e-05, 9.5e-05, 
9.5e-05, 0.000111, 0.00011, 8.5e-05, 1e-04, 0.000225)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -110L))

Вот мой код

library(ggplot2)
library(tidyverse)

plot_data %>%
  ggplot(aes(x=year, y=value, fill=country)) + 
  geom_area()

Я не уверен, как это сделать, но я начал с ранга, основанного на прошлом году.

ordered_plot_data = plot_data %>% 
  filter(year == last(year)) %>% 
  arrange(desc(value)) %>% 
  mutate(rank = row_number())

Скажем, я хотелтри страны показаны и сгруппированы остальные в «другие»:

n_countries = 3

first_part = ordered_plot_data %>% 
  top_n(n_countries, value)

last_part = ordered_plot_data %>%
  top_n(-(length(unique(ordered_plot_data$country))-n_countries), value) %>% 
  summarise(country = "Other",
            year = first(year),
            value = sum(value),
            rank = n_countries + 1)

joined_data = rbind(first_part, last_part)

Это дает мне сгруппированные данные, которые упорядочены, но только за 2017 год. Поэтому я подумал, что я мог бы использовать это как-то и для каждой годовой группы согласнодля группы, которую я создал с 2017 года, но, конечно, это кажется слишком сложным, и мне бы очень хотелось помочь с более простым способом решить эту проблему.

1 Ответ

3 голосов
/ 03 октября 2019

Ключевым моментом является то, что вам нужно использовать этот порядок для сортировки факторной переменной. По умолчанию первый уровень коэффициента отображается сверху, поэтому вы хотите, чтобы он переходил от «Другое» к максимальному значению. Следующий код должен работать для вас!

library(ggplot2)
library(tidyverse)

plot_order = plot_data %>% 
  mutate(country = as.character(country)) %>%
  filter(year == last(year)) %>% 
  arrange(desc(value)) %>% 
  mutate(rank = row_number())

n_countries = 3

final_plot <- plot_data %>% 
  mutate(country = as.character(country)) %>%
  mutate(plot_label = ifelse(country %in% plot_order$country[1:n_countries], country, 'Other')) %>%
  mutate(plot_label = factor(plot_label, levels = c('Other', rev(plot_order$country[1:n_countries])))) %>%
  group_by(plot_label, year) %>%
  summarise(value = sum(value)) 

final_plot %>%
  ggplot(aes(x=year, y=value, fill=plot_label)) + 
  geom_area()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...