#r #ggplot2 #geom-area
Вопрос:
Я хочу создать диаграмму с многоуровневой областью, используя geom_area() для набора данных, в котором даты указаны по оси x, а частота-по оси y. Мой набор данных выглядит следующим образом
Date Variant. Frequency
2020-08-01 AY.1 0
2020-08-01 B.1.351 0
2020-08-01 B.1.617.1 0
2020-08-01 B.1.617.2 0
2020-08-01 B.1.617.3 0
2020-08-01 others 1
2020-08-01 others 1
2020-09-01. AY.1 0
2020-09-01 B.1.351 0
2020-09-01 B.1.617.1 0
2020-09-01 B.1.617.2 0
2020-09-01 B.1.617.3 0
2020-09-01 others 1
2020-09-01 others 1
.
.
.
.
2021-08-03 B.1.617.3 0.00564
2021-08-03 others 0.36
2021-08-03 others 0.36
2021-08-04 AY.1 0.000713
2021-08-04 AY.4 0.42
2021-08-04 B.1.1.7 0.00546
2021-08-04 B.1.351 0.00137
2021-08-04 B.1.617.1 0.0109
2021-08-04 B.1.617.2 0.22
Я попытался использовать следующий код для создания участка с многоуровневой областью —
data %>%
ggplot(aes(x=Date, y=Frequency, fill=Variant))
geom_area(position = 'fill', alpha=0.8)
scale_x_date(date_breaks = '1 month', date_labels = '%b-%y',expand = c(0.01,0))
Однако в итоге я получаю неожиданный результат, который выглядит следующим образом
Я попытался изменить настройку позиции на «идентичность» с geom_area(position='identity')
помощью , это дает улучшенный результат, но не то, что я хочу.
Я бы хотел, чтобы выходные данные выглядели примерно как базовая диаграмма областей с накоплением в R —
Я тоже пробовал geom_bar()
, что дает мне сложенную гистограмму, но я хотел бы создать аналогичную диаграмму с областью
Комментарии:
1. Маловероятно, что мы сможем приблизиться к созданию ваших графиков с тем подмножеством данных, которое у нас есть здесь. Я думаю, что есть два простых выхода из этого: (1) гораздо предпочтительнее значительно сократить ваши данные, возможно, до 3-4 категорий и всего по несколько данных в каждой; или (2) позволить нам получить весь набор данных, хотя понимаю, что многие не хотят загружать данные по внешним ссылкам.
Ответ №1:
Чтобы создать диаграмму с многоуровневой областью:
- Самое важное — это форма ваших данных. Как уже упоминал r2evans.
- Здесь я взял ваш фрагментированный фрейм данных и изменил его с помощью дополнительных столбцов, чтобы показать, как ваши данные должны быть организованы для построения такого рода графика.
- В принципе, вам нужна повторяющаяся группа с течением времени с определенными значениями -> здесь группа a:g, время 1:6 и частота:
измененные поддельные данные
library(tidyverse)
data <- df %>%
mutate(Date = lubridate::ymd(Date)) %>%
mutate(time = rep(row_number(), each=7, length.out = n())) %>%
mutate(group = rep(letters[1:7], length.out = n())) %>%
mutate(Frequency = rep(runif(29, 34, 100), length.out = n()))
код для построения:
library(tidyverse)
data %>%
ggplot(aes(x=time, y=Frequency, fill=group))
geom_area(alpha=0.8)
поддельные данные:
df <- structure(list(Date = structure(c(18475, 18475, 18475, 18475,
18475, 18475, 18475, 18506, 18506, 18506, 18506, 18506, 18506,
18506, 18539, 18539, 18539, 18539, 18539, 18539, 18539, 18475,
18475, 18475, 18475, 18475, 18475, 18475, 18506, 18506, 18506,
18506, 18506, 18506, 18506, 18539, 18539, 18539, 18539, 18539,
18539, 18539), class = "Date"), Variant = c("AY.1", "B.1.351",
"B.1.617.1", "B.1.617.2", "B.1.617.3", "others", "others", "AY.1",
"B.1.351", "B.1.617.1", "B.1.617.2", "B.1.617.3", "others", "others",
"AY.1", "B.1.351", "B.1.617.1", "B.1.617.2", "B.1.617.3", "others",
"others", "AY.1", "B.1.351", "B.1.617.1", "B.1.617.2", "B.1.617.3",
"others", "others", "AY.1", "B.1.351", "B.1.617.1", "B.1.617.2",
"B.1.617.3", "others", "others", "AY.1", "B.1.351", "B.1.617.1",
"B.1.617.2", "B.1.617.3", "others", "others"), Frequency = c(57.1679558907636,
63.9314113892615, 36.638229729142, 94.1662813336588, 75.5338987568393,
40.2345195417292, 69.4448804655112, 45.4072538088076, 60.232708573807,
59.4782519731671, 94.5594410258345, 91.2153454185463, 79.8043070686981,
56.9402130353265, 48.7265761620365, 72.413387727458, 67.7010886864737,
55.5641814963892, 69.7157254447229, 86.2067115586251, 63.0903459019028,
73.7501232894138, 92.7098404220305, 53.342769942712, 61.7025430542417,
72.0743641522713, 90.9143544523977, 66.1621201317757, 91.2102537448518,
57.1679558907636, 63.9314113892615, 36.638229729142, 94.1662813336588,
75.5338987568393, 40.2345195417292, 69.4448804655112, 45.4072538088076,
60.232708573807, 59.4782519731671, 94.5594410258345, 91.2153454185463,
79.8043070686981), time = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L,
6L), group = c("a", "b", "c", "d", "e", "f", "g", "a", "b", "c",
"d", "e", "f", "g", "a", "b", "c", "d", "e", "f", "g", "a", "b",
"c", "d", "e", "f", "g", "a", "b", "c", "d", "e", "f", "g", "a",
"b", "c", "d", "e", "f", "g")), class = "data.frame", row.names = c(NA,
-42L))