Отображение всех переменных в граненой гистограмме - PullRequest
1 голос
/ 12 апреля 2020

Я хотел бы получить bar chart, который выделяет различные категории - я использую geom_col с аспектом для каждой из стран.

Проблема в том, что цветная версия не совпадает с 'greyed' версией указанной c страны; вместо этого он всегда находится внизу диаграммы.

Steel Production chart

Производится с этим кодом:


# Steel production data
  steel <- tribble(
    ~country,   ~"2016",    ~"2017",    ~"2018",    ~"2019",
    "China",     828.4,  853.7,  863.9,  988.2, 
    "Japan",     104.9,  104.7,  104.2,  99.6, 
    "India",     95.0,   101.5,  107.8,  111.5, 
    "USA",     80.2,     81.6,   84.2,   88.2, 
    "Other",     564.8,  577.7,  587.8,  549.9 
  )

# Pivot the data and turn country into factors
  steel_long <- tidyr::pivot_longer(steel, -country, names_to = "year", values_to = "production")
  names(steel_long) <- tolower(names(steel_long))

  steel_long$country <- as.factor(steel_long$country)
  steel_long$country <- forcats::fct_relevel(steel_long$country, "Other", after = Inf) # Always put RotW last

  steel_long$country2 <- steel_long$country # Add second country to add the grey lines on the mini charts

  steel_long$year <- lubridate::make_date(year = steel_long$year, 12, 31)

# Graph - Column
  ggplot() +
    geom_col(data = steel_long[, 2:4], 
             mapping = aes(x = year, y = production, group = country2), colour = "white", fill = "grey", lwd = 1) +
    geom_col(data = steel_long, mapping = aes(x = year, y = production, fill = country), lwd = 1.1) +
    facet_wrap(~country) +
    labs(title = "Global steel production (Source: World Steel Association)", x = "", y = "Million metric tons") +
    guides(fill = "none") +
    theme_minimal()

Можно ли закрасить указанную c область колонка, которая относится к стране?

Спасибо

1 Ответ

1 голос
/ 12 апреля 2020

Попробуйте это. Основная идея c состоит в том, чтобы реплицировать набор данных в соответствии с количеством стран. При фасетировании набор данных разделяется в соответствии с фасетом var. Реплицируя набор данных, мы гарантируем, что график столбца в каждом фасете состоит из всего набора данных. Единственным отличием между отдельными наборами данных является столбец country_fill, который используется для задания цвета, который будет выделять страна, а для всех остальных - цвет заливки серый. Чтобы установить цвета заливки на графике, я использую scale_fill_identity.

library(tidyverse)

# Steel production data
steel <- tribble(
  ~country,   ~"2016",    ~"2017",    ~"2018",    ~"2019",
  "China",     828.4,  853.7,  863.9,  988.2, 
  "Japan",     104.9,  104.7,  104.2,  99.6, 
  "India",     95.0,   101.5,  107.8,  111.5, 
  "USA",     80.2,     81.6,   84.2,   88.2, 
  "Other",     564.8,  577.7,  587.8,  549.9 
)

# Pivot the data and turn country into factors
steel_long <- tidyr::pivot_longer(steel, -country, names_to = "year", values_to = "production")
names(steel_long) <- tolower(names(steel_long))

steel_long$country <- as.factor(steel_long$country)
steel_long$country <- forcats::fct_relevel(steel_long$country, "Other", after = Inf) # Always put RotW last

steel_long$country2 <- steel_long$country # Add second country to add the grey lines on the mini charts

steel_long$year <- lubridate::make_date(year = steel_long$year, 12, 31)

# Colors
colors <- scales::hue_pal()(5) %>% 
  setNames(unique(steel_long$country)) %>% 
  tibble::enframe(name = "country3", value = "country_fill")

# Replicate dataframe
steel_long_rep <- purrr::map(unique(steel_long$country), ~ steel_long) %>% 
  setNames(unique(steel_long$country)) %>% 
  bind_rows(.id = "country3") %>%
  # Join colors
  left_join(colors) %>% 
  # Set fill for non-facet countries to grey
  mutate(country_fill = ifelse(country != country3, "grey", country_fill))
#> Joining, by = "country3"

steel_long_rep$country3 <- forcats::fct_relevel(steel_long_rep$country3, "Other", after = Inf) 

# Graph - Column
ggplot() +
  geom_col(data = steel_long_rep, mapping = aes(x = year, y = production, group = country, fill = country_fill), colour = "white", lwd = 1) +
  scale_fill_identity() +
  facet_wrap(~country3) +
  labs(title = "Global steel production (Source: World Steel Association)", x = "", y = "Million metric tons") +
  guides(fill = "none") +
  theme_minimal()

Создано в 2020-04-12 пакетом Представить (v0.3.0)

...