график, а на легенде завис.
Для power bi это обычная практика и там, нет проблем с легендой, если данные в широком формате.
А вот для ggplot2 их надо сначала, в любом случае, переводить в длинный формат, чтобы была легенда?
library(dplyr)
library(ggplot2)
library(lubridate)
df <- data.frame(
month = format(seq.Date(as.Date('2000-01-01'), by = 'month', len = 12), "%b"),
amount = rnorm(mean = 100, sd = 10, n = 12),
amount_mtd = rnorm(mean = 30, sd = 5, n = 12),
month_plan = rnorm(mean = 110, sd = 5, n = 12)
)
df %>%
mutate(
month = factor(
month,
levels = df$month
)
) %>%
ggplot(
aes(x = month, y = amount_mtd)
) +
geom_col(
width = 0.5, fill = '#DD1C77'
) +
geom_col(
aes(x = month, y = amount),
alpha = 0.5,
fill = '#C994C7'
) +
geom_errorbar(
aes(ymin = month_plan, ymax = month_plan),
width = 0.5
) +
scale_y_continuous(
labels = scales::label_dollar(
suffix = " млн",
prefix = '')
) +
geom_text(
aes(label = amount_mtd %>% round(1)),
vjust = 0.7,
) +
geom_text(
aes(x = month, y = month_plan, label = month_plan %>% round(1)),
vjust = -1,
size = 4
) +
ylab(label = NULL) +
xlab(label = NULL)
формально для ggplot - это антипатерн, но на деле постоянно все этот антипаттерн используют, вот переделанный пример: library(dplyr) library(ggplot2) library(lubridate) df <- data.frame( month = format(seq.Date(as.Date('2000-01-01'), by = 'month', len = 12), "%b"), amount = rnorm(mean = 100, sd = 10, n = 12), amount_mtd = rnorm(mean = 30, sd = 5, n = 12), month_plan = rnorm(mean = 110, sd = 5, n = 12) ) df %>% mutate( month = factor( month, levels = df$month ) ) %>% ggplot( aes(x = month, y = amount_mtd) ) + geom_col( width = 0.5, aes(fill = 'единороги') ) + geom_col( aes(x = month, y = amount, fill = "феи"), alpha = 0.5, ) + geom_errorbar( aes(ymin = month_plan, ymax = month_plan), width = 0.5 ) + scale_y_continuous( labels = scales::label_dollar( suffix = " млн", prefix = '') ) + geom_text( aes(label = amount_mtd %>% round(1)), vjust = 0.7, ) + geom_text( aes(x = month, y = month_plan, label = month_plan %>% round(1)), vjust = -1, size = 4 ) + ylab(label = NULL) + xlab(label = NULL) + scale_fill_manual(values = c('единороги' = "#DD1C77", "феи" = "#C994C7"))
о, спасибо) Но как тогда, все таки, правильно, с точки зрения ggplot?
правильно работать с tidy- форматом ))) т.е. с длинными данными, но по факту при 2-3 геомах можно и руками прописать
В общем, все таки вот так правильно сначала таблицу перевести в длинный и потом от нее строить ггплоты?) df %>% mutate( month = factor( month, levels = df$month ) ) %>% pivot_longer( -month, names_to = 'names', values_to = 'values' )
да, вроде так, но в таком подходе есть свои недостатки... например, когда определенным типам значений нужно присвоить определенный цвет
Обсуждают сегодня