2016-04-16 5 views
1

Ich habe eine Excel-Diagramm, das ich in R. erstellen möchtenggplot2 Zeitreihen Diagramm mit Hintergrundschattierung

Excel Chart

Ich versuchte es mit einigen Dummy-Daten neu zu erstellen

a<-rnorm(12) 
a_ts<-ts(a, start=c(2015, 1), frequency=12) 
a_time<-time(a_ts) 
a_series<-ts.union(ret=a_ts, date=a_time) 
a_series_df<-as.data.frame(a_series) 

ggplot() + 
geom_rect(data=data.frame(xmin=decimal_date(as.Date(c("2015-01-01"))), 
xmax=decimal_date(as.Date(c("2015-05-31"))), ymin=-Inf, ymax=Inf), 
aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax), fill="pink", alpha=0.5) + 
geom_line(data = a_series_df, aes(x=date,y=ret, color='blue')) + 
theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5)) 
#this does not work 
#scale_x_date(breaks = "1 month", minor_breaks = "1 month", labels=date_format("%B-%d")) + 
#scale_y_continuous(labels = scales::percent) 

die wie folgt aussieht

R version

I Ich kämpfe mit den Datumsumwandlungen und setze auch die x- und y-Ursprünge auf Null und bekomme die Achsenbeschriftungen richtig, die letzten zwei Codezeilen arbeiten für Nicht-Datum-Datenpunkte. Ich möchte auch eine Legende unter dem Diagramm für Serie1, Serie2 und und Eintrag für den schattierten Bereich haben.

Jede Hilfe wäre willkommen.

Update nach den Vorschlägen der Anwendung:

X axis should be at y = 0 everything else should stay as it is, as in the excel

+0

Wie unterscheiden sich die zwei separaten Zeilen in den in Excel verwendeten Daten? Können Sie ein kleines Beispiel für die im Originalplot verwendeten Daten mit 'dput' angeben? Dummy-Daten sind in Ordnung, aber Sie müssen eine Spalte hinzufügen (z. B. einen Faktor), die die Daten in den einzelnen Zeilen unterscheidet. – steveb

+0

Ich habe absichtlich nur eine Datenreihe gedruckt, die ich komplett ausschneiden möchte. Sie können davon ausgehen, dass ich ein Datenrahmen/xts-Objekt mit 1 bis n Datenspalten habe. Fürs Erste freue ich mich über eine ähnliche Formatierung wie die Excel-Grafik für die Dummy-Daten. – ThatQuantDude

+1

Wenn Sie Ihren Code oben ausführen, werden Sie sehen, dass er einen Fehler generiert. Bitte stellen Sie sicher, dass der Beispielcode in Ihrer Frage vor dem Posten funktioniert. Prost. – shekeine

Antwort

2

Im Folgenden finden Sie ein Beispiel, das sollte hol dich mo Der Weg dorthin. Dies verwendet das Paket lubridate zum Arbeiten mit Datum und Uhrzeit (in diesem Fall Datumsangaben). Dies zeigt Ihnen eine Möglichkeit, wie Sie zwei separate Linien auf demselben Diagramm mit den meisten der angeforderten Modifikationen plotten können. In diesem Beispiel wird ein alpha von 0.05 verwendet.

library(lubridate) 
library(ggplot2) 

### Set up dummy data. 
dayVec  <- seq(ymd('2016-01-01'), ymd('2016-01-10'), by = '1 day') 
set.seed(1234) 
dayCount <- length(dayVec) 
dayValVec1 <- rnorm(dayCount) 
dayValVec2 <- rnorm(dayCount) 
dayDF  <- data.frame(Date = rep(dayVec, 2), 
         DataType = factor(c(rep('A', dayCount), rep('B', dayCount))), 
       Value = c(dayValVec1, dayValVec2)) 

### Dummy data in data frame (DataType is a factor) 
dayDF 
##   Date DataType  Value 
## 1 2016-01-01  A -1.20706575 
## 2 2016-01-02  A 0.27742924 
## 3 2016-01-03  A 1.08444118 
## 4 2016-01-04  A -2.34569770 
## 5 2016-01-05  A 0.42912469 
## 6 2016-01-06  A 0.50605589 
## 7 2016-01-07  A -0.57473996 
## 8 2016-01-08  A -0.54663186 
## 9 2016-01-09  A -0.56445200 
## 10 2016-01-10  A -0.89003783 
## 11 2016-01-01  B -0.47719270 
## 12 2016-01-02  B -0.99838644 
## 13 2016-01-03  B -0.77625389 
## 14 2016-01-04  B 0.06445882 
## 15 2016-01-05  B 0.95949406 
## 16 2016-01-06  B -0.11028549 
## 17 2016-01-07  B -0.51100951 
## 18 2016-01-08  B -0.91119542 
## 19 2016-01-09  B -0.83717168 
## 20 2016-01-10  B 2.41583518 

ggplot(dayDF, aes(Date, Value, colour = DataType)) + 
    geom_line() + 
    geom_rect(aes(xmin=ymd('2016-01-02'), 
        xmax = ymd('2016-01-06'), 
        ymin = -Inf, 
        ymax = Inf), fill = 'pink', alpha = 0.05) + 
    scale_x_datetime(labels = date_format('%b-%d'), breaks = date_breaks('1 day'), expand=c(0,0)) + 
    theme(axis.text.x  = element_text(angle=90), 
      legend.position = 'bottom') 

enter image description here

EDIT

Hinweis, der date_breaks Wert kann auf 1 month geändert werden, wenn Sie mit dem Monat darstellen möchten. Dieses Beispiel ist nur pro Tag.

+0

Ich werde Ihre Antwort akzeptieren, wenn Sie auch hinzufügen, wie Sie die x-Achse auf '2016-01-01' ohne zu beginnen kleiner Offset – ThatQuantDude

+0

Ich habe den Plot-Befehl aktualisiert, um 'date_breaks' zu spezifizieren. Ich werde die Handlung in Kürze aktualisieren. – steveb

+0

@ Markus.london Das Bild wurde aktualisiert, um die Codeänderung widerzuspiegeln. – steveb

1

So stellen Sie sicher, dass die Werte sind tatsächliche Date Objekte:

library(lubridate) 
library(ggplot2) 
library(scales) 

set.seed(1492) 
a <- rnorm(12) 

a_ts <- ts(a, start=c(2015, 1), frequency=12) 
a_time <- time(a_ts) 

a_series <- ts.union(ret=a_ts, date=a_time) 
a_series_df <- as.data.frame(a_series) 
a_series_df$date <- as.Date(as.character(a_series_df$date), "%Y.%j") 

rect_df <- data.frame(xmin=as.Date(c("2015-01-01")), 
         xmax=as.Date(c("2015-05-31"))) 

ggplot() + 
    geom_rect(data=rect_df, 
      aes(xmin=xmin, xmax=xmax, ymin=-Inf, ymax=Inf), 
      fill="pink", alpha=0.5) + 
    geom_line(data = a_series_df, aes(x=date, y=ret), color='blue') + 
    scale_x_date(expand=c(0,0), labels=date_format("%b-%d"), 
       date_breaks="1 month") + 
    scale_y_continuous(expand=c(0,0), labels=percent) + 
    labs(x=NULL, y=NULL) + 
    theme_bw() + 
    theme(axis.text.x=element_text(angle=90, hjust=1, vjust=0.5)) + 
    theme(panel.grid.minor=element_blank()) + 
    theme(panel.grid.major.x=element_blank()) + 
    theme(axis.ticks=element_blank()) 

enter image description here

1
#Make data 
a_time <- time(ts(rnorm(12), start=c(2015, 1), frequency=12)) 
a_series <-ts.union(ret=a_ts, date=a_time) 
a_series_df <-as.data.frame(a_series) 
a_series_df$date <- as.Date(format(date_decimal(a_series_df$date), 
            "%d-%m-%Y"), format="%d-%m-%Y") 

dat_rect <- data.frame(
        xmin = as.Date(c("2015-01-01")), 
        xmax = as.Date(c("2015-05-31")), 
        ymin = -Inf, 
        ymax = Inf 
) 

#Next time, if using functions not in base R, indicate what packages they are from 
#decimal_date for example is from lubridate, which in this solution it is not needed. 
ggplot() + 
     geom_rect(data=dat_rect, 
        aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax), 
        fill="pink", alpha=0.5) + 
     geom_line(data=a_series_df, aes(x=date,y=ret, color='blue')) + 

     theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5)) + 

#Set date 
scale_x_date(date_breaks='1 month', 
      date_minor_breaks='1 month', 
      labels=date_format("%B-%d"), 
      expand=c(0,0)) + 
scale_y_continuous(labels = scales::percent) 
Verwandte Themen