У меня есть xts df следующего формата:
structure(c("May 2022", "Jun 2022", "Jul 2022", "Aug 2022", "Sep 2022",
"Oct 2022", "Nov 2022", "Dec 2022", " 3035.199", " 5500.000",
"11568.750", " 2510.000", " 6999.999", "21792.149", " 9750.000",
" 5624.999", " 2250.000", " 4136.975", " 6525.500", " 2771.875",
" 4637.500", "16273.499", " 6000.000", " 4494.649", " 2500.000",
" 0.000", " 3029.000", " 2803.500", " 0.000", "14481.250",
" 4374.998", " 4062.498", " 0.000", " 3075.000", " 6939.249",
" 1500.000", " 4183.157", " 5769.000", " 3559.500", " 3250.000"
), class = c("xts", "zoo"), index = structure(c(1651363200, 1654041600,
1656633600, 1659312000, 1661990400, 1664582400, 1667260800, 1669852800
), tzone = "UTC", tclass = "yearmon"), .Dim = c(8L, 5L), .Dimnames = list(
NULL, c("Month", "Cat 1", "Cat 2", "Cat 3", "Cat 4")))
Я пытаюсь создать гистограмму с накоплением, используя библиотеку dygraphs.
library(dygraphs)
library(lubridate)
today <- as.Date(Sys.time())
last_6 <- today+months(-6)
dygraph(df) %>%
dyAxis("y", label= "Total") %>%
dyRangeSelector(dateWindow = c(last_6, today)) %>%
dyMultiColumnGroup(c("Cat 1", "Cat 2", "Cat 3", "Cat 4"))
Это создаст гистограмму, которая выглядит следующим образом:
Мне было интересно, есть ли у кого-нибудь совет о том, как сделать гистограмму с накоплением? Многие руководства говорят о привлечении плоттеров, но, к сожалению, они недостаточно подробны, чтобы я мог правильно понять, что происходит.
Добавление этого:
dyStackedBarGroup(c("Cat 1", "Cat 2", "Cat 3", "Cat 4"))
вместо строки dyMultiColumnGroup приводит к:
Error in cumulativeYval + points : non-numeric argument to binary operator
Привет, Питер, извините за это, это должно быть исправлено сейчас (нужна смазка)
Кажется, что вы должны создавать каждый временной ряд как ts
, поэтому я конвертирую их каждый отдельно, а затем объединяю их с cbind
. Вот воспроизводимый пример:
Cat1 <- ts(c(3035.199, 5500.000, 11568.750, 2510.000, 6999.999, 21792.149, 9750.000, 5624.999), start = c(2022, 5), end = c(2022, 12), frequency = 12)
Cat2 <- ts(c(2250.000, 4136.975, 6525.500, 2771.875, 4637.500, 16273.499, 6000.000, 4494.649), start = c(2022, 5), end = c(2022, 12), frequency = 12)
Cat3 <- ts(c(2500.000, 0.000, 3029.000, 2803.500, 0.000, 14481.250, 4374.998, 4062.498), start = c(2022, 5), end = c(2022, 12), frequency = 12)
Cat4 <- ts(c(0.000, 3075.000, 6939.249, 1500.000, 4183.157, 5769.000, 3559.500, 3250.000), start = c(2022, 5), end = c(2022, 12), frequency = 12)
df <- cbind(Cat1, Cat2, Cat3, Cat4)
library(dygraphs)
library(lubridate)
today <- as.Date(Sys.time())
last_6 <- today+months(-6)
dygraph(df) %>%
dyAxis("y", label= "Total") %>%
dyRangeSelector(dateWindow = c(last_6, today)) %>%
dyStackedBarGroup(name = c("Cat1", "Cat2", "Cat3", "Cat4"))
Created on 2022-12-22 with reprex v2.0.2
Я должен использовать dygraph чаще!
Привет @TarJae, Да, интересный пакет! Хотя документацию можно было бы улучшить.
Хотя у Квинтена есть отличный рабочий ответ, я решил добавить к нему.
Вам не нужны отдельные ts
объекты; однако вам нужно, чтобы данные были числовыми.
Предполагая, что данные из dput
названы df
:
# drop the months column, change data to numeric, restore ts class
df <- df[ ,-1] %>% sapply(as.numeric) %>%
ts(start = c(2022, 5), deltat = 1/12)
Теперь вы готовы построить график.
dygraph(df) %>%
dyAxis("y", label= "Total") %>%
dyRangeSelector(dateWindow = c(today() - months(6), today())) %>%
dyStackedBarGroup(dimnames(df)[[2]])
Спасибо за это, я думаю, что это почти исправлено. Хотя кажется, что объект ts нарушает порядок данных (по месяцам), есть идеи, как это обойти?
О, чувак, я понял, что произошло. Когда я впервые опубликовал этот ответ, я установил диапазон сюжета с мая по декабрь и понял, что это не то, что вы искали. Когда я изменил селектор диапазона, я изменил дату начала в вызове на ts()
. Этого не должно было случиться. Сейчас я исправил код. Единственное изменение в аргументе start
в призыве к ts()
object 'last_6' not found
ошибка при запуске данных и рассматриваемого кода. Вы получаете это при запуске вопроса в новой версии R?