169 похожих чатов

Вот, примерно такой датасет в широком формате я соорудил, построил

график, а на легенде завис.

Для 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)

6 ответов

19 просмотров

формально для 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"))

Марк- Автор вопроса
Dm Kb
формально для ggplot - это антипатерн, но на деле ...

о, спасибо) Но как тогда, все таки, правильно, с точки зрения ggplot?

Марк
о, спасибо) Но как тогда, все таки, правильно, с ...

правильно работать с tidy- форматом ))) т.е. с длинными данными, но по факту при 2-3 геомах можно и руками прописать

Марк- Автор вопроса
Dm Kb
правильно работать с tidy- форматом ))) т.е. с дли...

В общем, все таки вот так правильно сначала таблицу перевести в длинный и потом от нее строить ггплоты?) df %>% mutate( month = factor( month, levels = df$month ) ) %>% pivot_longer( -month, names_to = 'names', values_to = 'values' )

Марк
В общем, все таки вот так правильно сначала таблиц...

да, вроде так, но в таком подходе есть свои недостатки... например, когда определенным типам значений нужно присвоить определенный цвет

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта