Ответ 1
Интересный вопрос. Чтобы сделать это правильно с помощью баров, нам нужно использовать полигоны, чтобы правильно учитывать "деформацию" каждого угла. Этот график будет выглядеть лучше, чем больше баров за каждый цикл, но вы можете изменить пределы y, чтобы избежать сильных искажений в центре. Вам придётся придумать какой-либо способ красиво пометить ось y, но coord_polar
не очень хорош в этом, чтобы начать с.
library(tidyverse)
Сначала создайте образец df с нуля:
monthly <-
expand.grid(month = 1:12, year = factor(unique(monthly$year))) %>%
mutate(value = runif(n(), 10, 20),
y = as.numeric(year) - 1 + (month - 1) / 12)
Или, работая из существующего df:
monthly <- monthly %>%
mutate(y = as.numeric(year) - 1 + (month - 1) / 12)
Продолжите следующее:
bars <- monthly %>%
mutate(value_norm = value / (max(value) * 1.1),
xmin = month - 0.5,
xmax = month + 0.5,
ymin = y,
ymax = y + value_norm)
# we could plot `bars` here, but things will not line up nicely, since
# the bar will be nice and flat, but it needs to curve with the spiral.
poly <- bars %>%
rowwise() %>%
do(with(., data_frame(year = year,
month = month,
x = c(xmin, xmax, xmax, xmin),
y = c(ymin - 1/24,
ymin + 1/24,
ymax + 1/24,
ymax - 1/24))))
ggplot(poly, aes(x, y, fill = interaction(month, year))) +
geom_polygon(col = 1) +
coord_polar() +
ylim(-3, 5) +
viridis::scale_fill_viridis(discrete = TRUE, option = 'C') +
scale_x_continuous(breaks = 1:12, labels = month.name) +
theme_minimal() +
theme(legend.position = "none", axis.text.y = element_blank(),
axis.title = element_blank())
Альтернативой является просто создание круговой тепловой карты:
bars2 <- monthly %>%
mutate(xmin = month - 0.5,
xmax = month + 0.5,
ymin = y,
ymax = y + 1)
poly2 <- bars2 %>%
rowwise() %>%
do(with(., data_frame(value = value,
year = year,
month = month,
x = c(xmin, xmax, xmax, xmin),
y = c(ymin - 1/24, ymin + 1/24, ymax + 1/24, ymax - 1/24))))