Ключевой частью ggplot2
является то, что данные должны быть аккуратными , чтобы они работали должным образом. Иногда это может быть немного хлопотно, но обычно окупается.
Это мое полное решение: усердно работаю над получением данных в аккуратном формате, а затем ggplot2
намного проще:
library(dplyr)
library(ggplot2)
library(readxl)
library(tidyr)
sugar <- read_excel("data/MakeoverMondayData.xlsx")
children_2014_2016 <- sugar %>%
gather("period", "intake", -1) %>%
separate(1, c("category", "age"), sep = " ", extra = "merge") %>%
filter(
category == "Children",
period == "(2014/15-2015/16)"
) %>%
mutate(age = factor(age, levels = c("1.5-3 years", "4-10 years", "11-18 years"), ordered = TRUE))
label_ <- data.frame(x = 2, y = 5, label = "5% of total energy")
children_2014_2016 %>%
ggplot() +
geom_bar(stat = "identity", fill = "lightblue", aes(x = age, y = intake)) +
geom_hline(yintercept = 5, linetype = "dashed", colour = "grey") +
geom_text(data = label_, aes(x = x, label = label, y = y)) +
ggtitle("Children's free sugars intake (as % of of total energy)") +
labs(x = "Age", y = "Free sugars as % of of total energy") +
theme_minimal()
![enter image description here](https://i.stack.imgur.com/SZlmY.png)
Теперь я попытаюсь объяснить, как это работает:
- Первым шагом было бы привести данные в порядок. Для этого я собираюсь
tidyr::gather
столбцов, чтобы иметь два новых столбца, period
и intake
. -1
означает, что я собираю всего, кроме первого столбца.
gather("period", "intake", -1)
Разделите первый столбец, чтобы на следующем этапе я мог лучше контролировать фильтрацию. Я разделяю первый столбец на два новых столбца:
category
(Children, Adult, et c.) И
age
. Аргумент
extra = "merge"
присутствует потому, что при разделении пробелом будет более двух столбцов, поэтому я хочу объединить дополнительные элементы в последнем столбце.
separate(1, c("category", "age"), sep = " ", extra = "merge")
Фильтр по категории и периоду. Это довольно просто
filter(
category == "Children",
period == "(2014/15-2015/16)"
) %>%
Измените столбец
age
на упорядоченный фактор, чтобы я мог контролировать порядок появления категорий на графике
mutate(age = factor(age, levels = c("1.5-3 years", "4-10 years", "11-18 years"), ordered = TRUE))
После этого все, кроме метки "5 % от общей энергии "довольно стандартный ggplot2
, я думаю.