R Изменить цвет фона ggplot с учетом семестров - PullRequest
1 голос
/ 04 ноября 2019

У меня есть фрейм данных фондового рынка, и я хочу создать график с цветным фоном. Но цвет должен быть основан на семестрах (первая или вторая половина года).

Здесь вы можете получить данные:

library(tidyverse)
library(tidyquant)
library(lubridate)

GDAXI<-tq_get("^GDAXI", get = "stock.prices")

GDAXI%>%
  ggplot(aes(x=date, y=close))+geom_line()

А вот мой сюжет: enter image description here

Теперь я хотел бы иметь цветной фон. Первое полугодие (январь-июнь) должно быть синим, а второе полугодие (июль-декабрь) должно быть красным.

С помощью

GDAXI<-GDAXI%>%mutate(semester=lubridate::semester(date))

вы можете добавить эти семестры. (январь-июнь == 1 и июль-декабрь == 2)

А теперь я хочу добавить цветной фон с geom_rect()

GDAXI%>%
  ggplot(aes(x=date, y=close))+geom_line()+ 
  geom_rect(aes(xmin = date, xmax = date, ymin = -Inf, ymax = Inf, fill = semesters)

Но это не работает. Может кто-нибудь помочь мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Более того, я нашел другое решение:

GDAXI<-GDAXI%>%mutate(semester=lubridate::semester(date),
                      year=lubridate::year(date))

GDAXI<-GDAXI%>%group_by(year, semester)

table<-GDAXI%>%summarise(x1=head(date,1),
                         x2=tail(date,1),
                         y1=-Inf,
                         y2=Inf,
                         color=head(semester,1))%>%
               mutate(color=ifelse(color==1,"red","blue"))

GDAXI%>%
  ggplot()+
  geom_line(aes(x=date, y=close))+
  geom_rect(data=table, aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), fill=table$color, alpha=0.3)+
  theme_bw()
1 голос
/ 05 ноября 2019

Ваша предыдущая попытка с этим

geom_rect(aes(xmin = date, xmax = date, ymin = -Inf, ymax = Inf, fill = semesters)

идет по правильному пути. Это не работает, потому что xmin будет таким же, как xmax, поэтому нет прямоугольника? Также я думаю, что geom_rect не работает с -Inf и + Inf, в отличие от geom_text и т. Д.

library(lubridate)

GDAXI<-GDAXI%>%mutate(semester=semester(date))
# define y limits
LIMS = range(GDAXI$close,na.rm=T)
# we need to define the semesters and year, i.e the boxes we want to plot
GDAXI$semester_grp = semester(GDAXI$date, with_year = TRUE)

# here we create the coordinates of the rectangle
# basically x1 is start of semester
# x2 is end of semester
rectData = GDAXI %>% group_by(semester_grp) %>% 
summarize(x1=min(date),x2=max(date),y1=LIMS[1],y2=LIMS[2],semester=unique(semester))    
# we call ggplot on the two separate data frames
ggplot()+
geom_rect(data=data.frame(rectData),mapping=aes(xmin=x1,xmax=x2,ymin=y1,ymax=y2,fill=factor(semester)),alpha=0.3) + 
geom_line(data=GDAXI,aes(x=date, y=close))+
scale_fill_manual(values=c("blue","red"),name="Semester")+
theme_bw()

I am not very good with colours :(

Это должно работать, если ваша датазначения не имеют пробелов. Вы можете немного изменить их, если работаете с другими данными с пробелами.

И я думаю, вам нужно поэкспериментировать с scale_fill_manual и alpha в geom_rect, чтобы получить правильные цвета:)

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