Как у меня есть только метки оси X, которые указывают, когда год изменяется в R? - PullRequest
0 голосов
/ 14 марта 2020

Я скачал пару файлов .csv, и они выглядят примерно так, только намного дольше, и дата продолжается до 2020-03-13.

        Date    Open    High     Low   Close Adj.Close     Volume
1 2015-03-13 2064.56 2064.56 2041.17 2053.40   2053.40 3498560000
2 2015-03-16 2055.35 2081.41 2055.35 2081.19   2081.19 3295600000
3 2015-03-17 2080.59 2080.59 2065.08 2074.28   2074.28 3221840000
4 2015-03-18 2072.84 2106.85 2061.23 2099.50   2099.50 4128210000
5 2015-03-19 2098.69 2098.69 2085.56 2089.27   2089.27 3305220000
6 2015-03-20 2090.32 2113.92 2090.32 2108.10   2108.10 5554120000

Я создал фрейм данных, который выглядит следующим образом на основе данных

        Date t        SandP          AMD
1          0 1  0.000000000  0.000000000
2 2015-03-16 2  0.013442909  0.003629768
3 2015-03-17 3 -0.003325698  0.003616640
4 2015-03-18 4  0.012085102 -0.007246409
5 2015-03-19 5 -0.004884489 -0.003642991
6 2015-03-20 6  0.008972382  0.021661497

Я пытаюсь отобразить столбцы SandP и AMD на одной и той же оси, однако я хочу, чтобы метки оси отображались каждый год (когда каждый год изменяется ). Поэтому я хотел бы только 6 тиков на оси (2015,2016,2017,2018,2019,2020).

Если это поможет, файлы .csv были загружены из данных Yahoo Finance для S & P500.

Это мой код до сих пор:

SPdata <- read.csv("^GSPC.csv")
AMDdata <- read.csv("AMD.csv")

head(SPdata)

R_t <- function(t){
  S=log(SPdata[t,6])-log(SPdata[t-1,6])
  return(S)
}
S_t <- function(t){
  S=log(AMDdata[t,6])-log(AMDdata[t-1,6])
  return(S)
}

comparedata <- data.frame(0,1,0,0)
names(comparedata)[1]<-"Date"
names(comparedata)[2]<-"t"
names(comparedata)[3]<-"SandP"
names(comparedata)[4]<-"AMD"


t<-2
while(t<1260){
  comparedata <-rbind(comparedata, list(AMDdata[t,1],t,R_t(t),S_t(t)))
  t=t+1
}

# install.packages("ggplot2")
library("ggplot2")

ggplot() +
  geom_line(data=comparedata, aes(x=Date,y=SandP),color="red",group=1)+
  geom_line(data=comparedata, aes(x=Date,y=AMD), color="blue",group=1)+
  labs(x="Date",y="Returns")

1 Ответ

0 голосов
/ 14 марта 2020

Я думаю, вам нужно использовать scale_x_date и установить аргумент date_breaks и date_labels (см. Официальную документацию: https://ggplot2.tidyverse.org/reference/scale_date.html)

Здесь я воссоздаю Пример использования небольшой части предоставленных вами данных:

library(lubridate)
date <- seq(ymd("2015-03-16"), ymd("2020-03-13"), by = "day")
df <- data.frame(date = date,
                 t = 1:1825,
                 SandP = rnorm(1825),
                 AMD = rnorm(1825))

Начиная с этого примера, я преобразую кадр данных в более длинный формат, используя функцию pivot_longer из tidyr:

library(tidyr)
DF <- df %>% pivot_longer(cols = c(SandP, AMD), names_to = "indices", values_to = "values")

# A tibble: 3,650 x 4
   date           t indices  values
   <date>     <int> <chr>     <dbl>
 1 2015-03-16     1 SandP    0.566 
 2 2015-03-16     1 AMD     -0.185 
 3 2015-03-17     2 SandP   -1.59  
 4 2015-03-17     2 AMD      0.236 
 5 2015-03-18     3 SandP    1.11  
 6 2015-03-18     3 AMD     -1.52  
 7 2015-03-19     4 SandP   -1.02  
 8 2015-03-19     4 AMD      0.0833
 9 2015-03-20     5 SandP    2.78  
10 2015-03-20     5 AMD     -0.173 
# … with 3,640 more rows

Затем я строю оба индекса в соответствии с датой, используя ggplot2:

library(ggplot2)
ggplot(DF, aes(x = date, y = values, color = indices))+
  geom_line()+
  labs(x="Date",y="Returns")+
  scale_x_date(date_breaks = "year", date_labels = "%Y")

enter image description here

Выглядит ли то, что вы пытаетесь достичь ?

...