2017-09-15 2 views
0

Je suis en train de faire quelque chose comme https://stackoverflow.com/a/29649406/15485 mais je reçois l'erreurgeom_rect et ggplot2 Erreur: L'esthétique doit être soit la longueur 1 ou même que les données (2)

Error: Aesthetics must be either length 1 or the same as the data (2): xmin, xmax, ymin, ymax, x, y

Que « (2) » veux dire?

En quoi consiste «l'esthétique»? Je aes dans ggplot et aes à geom_rect mais je n'ai aucune idée sur la façon de les corriger ... Je suis peur que je ne pourrai jamais saisir ggplot ...

days<-rep(Sys.Date(),100)+seq(1,100) 
v<-sin(as.numeric(days)) 
df<-data.frame(days=days,v=v) 

shade <- data.frame(x1=c(as.Date('2017-10-15'),as.Date('2017-11-11')), 
        x2=c(as.Date('2017-10-20'),as.Date('2017-11-13')), 
        y1=c(-Inf,-Inf), y2=c(Inf,Inf)) 

library(ggplot2) 
plot(ggplot(df,aes(x=days,y=v)) 
    +geom_line() 
    +geom_rect(data=shade, 
       mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), color='grey', alpha=0.2) 
    +geom_point()) 
+1

BTW, le '(2)' signifie que la longueur de la 'data' est actuellement 2. Autrement dit, l'esthétique ne sont autorisés à être 1 ou 2, telle qu'elle est actuellement définie. @ Z.Lin montre pourquoi. – Axeman

Répondre

2

La ligne geom_rect tente d'hériter l'esthétique par défaut de la ligne supérieure ggplot(df, aes(x = days, y = v)).

qui suit travaillerait:

ggplot(df, aes(x=days, y=v)) + 
    geom_line() + 
    geom_rect(data=shade, inherit.aes = F, 
      aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), 
      color = 'grey', alpha=0.2) + 
    geom_point() 

enter image description here

(j'ai ajouté plus des sauts de ligne/espaces dans le code pour faciliter la lecture De plus, il n'y a pas besoin d'envelopper le tout objet ggplot dans plot()..)

+0

Merci beaucoup! En fait, dans https://stackoverflow.com/a/29649406/15485 'geom_line' a son propre' Aesthetics' et 'ggplot' n'en a pas. Dans –

+0

rstudio je besoin d'envelopper avec 'plot()' sinon aucun graphique est généré ... –

+0

@AlessandroJacopson C'est parce que votre '' + opérateurs sont au début de la ligne suivante, plutôt qu'à la fin de la précédente. Déplacez-les (selon mon exemple) et vous verrez le graphique. –