У меня есть следующие данные:
library(dplyr)
set.seed(122)
df <- as_tibble(rlnorm(1260, meanlog = 0.06, sdlog = 0.20))
date <- rep(c("Jan", "Feb", "Mär", "Apr", "Mai", "Jun",
"Jul", "Aug", "Sep", "Okt", "Nov", "Dez"), 5)
Предполагается, что это 1260 дневных цен, где один год = 252 дня, а 1 месяц = 21 день.
Теперь я хочу нарисовать линейную диаграмму с дневными ценами по оси Y и месяцами по оси X. Код ниже адаптирован из этой темы Графики данных временных рядов, когда столбец даты не существует:
library(tidyverse)
df %>%
as.data.frame() %>%
rename(price = 1) %>%
mutate(rnames = rownames(.)) %>%
ggplot(aes(x = as.numeric(rnames), y = price,
group = rep(1:5, times=1, each=252))) +
geom_line() +
labs(title = "Stock Price Chart", y = "Price", x = "date") +
scale_x_continuous(breaks = seq(1, 1260, by = 21), labels = date)
Однако я немного изменил свой df
, вставив новую первую строку со значением 1
.
df <- rbind(df[0,],c(1),df[1:nrow(df),])
Предполагается, что это начальная цена при t=0. К сожалению, сейчас код не работает. Есть ли быстрое решение для этого?
у нас нет df[0,]
. Вот что я получу, если запущу ваш код: Error in df[0, ] : incorrect number of dimensions
извините df <- as_tibble(df)
применяется заранее.
Посмотрите на мои правки. Вам нужно показать все это и убедиться, что они отформатированы правильно. Ваш вопрос должен быть воспроизводимым, минимальным и разборчивым (хорошо отформатированным). Более того, вы должны предоставить большую часть информации в теле вопроса, а не в комментариях. Вот почему я добавил их. Прочтите эту ветку о воспроизводимом примере: stackoverflow.com/questions/5963269/…... Вскоре я опубликую ответ.
Спасибо вам за помощь. Я собираюсь опубликовать лучшие примеры в будущем.
library(tidyverse)
df %>%
as.data.frame() %>%
rename(price = 1) %>%
mutate(rnames = rownames(.)) %>%
ggplot(aes(x = as.numeric(rnames)-1, y = price,
group = c(1,rep(1:5, times=1, each=252)))) +
geom_line() +
labs(title = "Stock Price Chart", y = "Price", x = "date") +
scale_x_continuous(breaks = seq(1, 1260, by = 21), labels = date)
Вы также можете добавить новую точку останова для точки 0
. изменив как scale_x
вот так:
scale_x_continuous(breaks = c(0, seq(1, 1260, by = 21)), labels = c("t=0", date))
Если вы все еще хотите, чтобы точка данных с price == 1
(ваша новая строка) была помечена как Jan
, тогда вам не нужно вычитать 1
из вашего x
в эстетике, и ваши разрывы не нужно манипулировать. Это работает в любом случае.
самое важное, чтобы заставить мой предыдущий код работать с вашим новым фреймом данных, меняет group
в эстетике, чтобы он был того же размера, что и ваш новый фрейм данных.
Я просто удалил прокладки слева и справа с помощью scale_x_continuous(breaks = seq(1, 1260, by = 21), labels = date,expand = c(0,0))
. Однако теперь я вижу, что первое значение y «1» начинается за пределами оси x. Я хотел бы, чтобы он лежал на первом значении x «Ян». Это возможно как-то? Для дальнейшего уточнения: первое значение y должно соответствовать 1 января, а последнее значение y должно соответствовать 31 декабря (21 декабря в моем примере, поскольку в месяцах всего 21 день).
@JjBlevins Как я указал в своем ответе, просто нужно избавиться -1
в aes
из ggplot
, чтобы эта строка была ggplot(aes(x = as.numeric(rnames), y = price,
... а остальное осталось тем, что у меня есть в верхней части моего ответа (полное решение), и вы просто добавьте свой ,expand = c(0,0)
в функцию scale_x
.
Я сказал это в ответе: Если вы все еще хотите, чтобы точка данных с ценой == 1 (ваша новая строка) была помечена как Январь, тогда вам не нужно вычитать 1 из вашего x в эстетике, и ваши перерывы не нужно манипулировать. Чтобы было ясно, теперь у вас есть (1261 точка данных), равный (5 лет * 12 месяцев * 21 день + 1 день).
спасибо, это сработало! Я спрашивал в следующей ветке, как добавить дополнительную ось абсцисс года: stackoverflow.com/questions/56339970/… Может быть, вы могли бы помочь там?
Я просто присмотрелся и даже без фасонных сеток есть эти "скачки" между годами. Есть идеи, почему?
@JjBlevins Это из-за группировки. stackoverflow.com/questions/19731718/…
это предотвратимо?
@JjBlevins просто не используйте group
в своем aes
вообще; значит избавься от group = c(1,rep(1:5, times=1, each=252))
это решило проблему, спасибо. Но зачем использовать его в первую очередь?
@JjBlevins Лично я не думаю, что связывать разные годы — хорошая идея, если только вы не хотите увидеть тенденции за десятилетие (а не за год).
Я понимаю! Спасибо.
Я сделал это:
df <- rbind(df[0,],c(1),df[1:nrow(df),])