Линейная диаграмма данных временных рядов с ежемесячными метками на оси X и ежедневными данными на оси Y

У меня есть следующие данные:

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 <- rbind(df[0,],c(1),df[1:nrow(df),])

Jj Blevins 27.05.2019 21:19

у нас нет df[0,]. Вот что я получу, если запущу ваш код: Error in df[0, ] : incorrect number of dimensions

M-- 27.05.2019 21:22

извините df <- as_tibble(df) применяется заранее.

Jj Blevins 27.05.2019 21:24

Посмотрите на мои правки. Вам нужно показать все это и убедиться, что они отформатированы правильно. Ваш вопрос должен быть воспроизводимым, минимальным и разборчивым (хорошо отформатированным). Более того, вы должны предоставить большую часть информации в теле вопроса, а не в комментариях. Вот почему я добавил их. Прочтите эту ветку о воспроизводимом примере: stackoverflow.com/questions/5963269/…... Вскоре я опубликую ответ.

M-- 27.05.2019 21:29

Спасибо вам за помощь. Я собираюсь опубликовать лучшие примеры в будущем.

Jj Blevins 27.05.2019 21:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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 день).

Jj Blevins 28.05.2019 10:49

@JjBlevins Как я указал в своем ответе, просто нужно избавиться -1 в aes из ggplot, чтобы эта строка была ggplot(aes(x = as.numeric(rnames), y = price, ... а остальное осталось тем, что у меня есть в верхней части моего ответа (полное решение), и вы просто добавьте свой ,expand = c(0,0) в функцию scale_x.

M-- 28.05.2019 16:02

Я сказал это в ответе: Если вы все еще хотите, чтобы точка данных с ценой == 1 (ваша новая строка) была помечена как Январь, тогда вам не нужно вычитать 1 из вашего x в эстетике, и ваши перерывы не нужно манипулировать. Чтобы было ясно, теперь у вас есть (1261 точка данных), равный (5 лет * 12 месяцев * 21 день + 1 день).

M-- 28.05.2019 16:05

спасибо, это сработало! Я спрашивал в следующей ветке, как добавить дополнительную ось абсцисс года: stackoverflow.com/questions/56339970/… Может быть, вы могли бы помочь там?

Jj Blevins 28.05.2019 19:50

Я просто присмотрелся и даже без фасонных сеток есть эти "скачки" между годами. Есть идеи, почему?

Jj Blevins 30.05.2019 23:50

@JjBlevins Это из-за группировки. stackoverflow.com/questions/19731718/…

M-- 30.05.2019 23:51

это предотвратимо?

Jj Blevins 30.05.2019 23:52

@JjBlevins просто не используйте group в своем aes вообще; значит избавься от group = c(1,rep(1:5, times=1, each=252))

M-- 30.05.2019 23:57

это решило проблему, спасибо. Но зачем использовать его в первую очередь?

Jj Blevins 31.05.2019 01:01

@JjBlevins Лично я не думаю, что связывать разные годы — хорошая идея, если только вы не хотите увидеть тенденции за десятилетие (а не за год).

M-- 31.05.2019 01:05

Я понимаю! Спасибо.

Jj Blevins 31.05.2019 01:13

Другие вопросы по теме