Il grafico a linee ggplot2 fornisce “geom_path: ogni gruppo è costituito da una sola osservazione. Devi regolare l'estetica del gruppo? "


170

Con questo frame di dati ("df"):

year pollution
1 1999 346.82000
2 2002 134.30882
3 2005 130.43038
4 2008  88.27546

Provo a creare un grafico a linee come questo:

  plot5 <- ggplot(df, aes(year, pollution)) +
           geom_point() +
           geom_line() +
           labs(x = "Year", y = "Particulate matter emissions (tons)", title = "Motor vehicle emissions in Baltimore")

L'errore che ottengo è:

geom_path: ogni gruppo è costituito da una sola osservazione. Devi regolare l'estetica del gruppo?

Il grafico appare come un diagramma a dispersione anche se voglio un grafico a linee. Ho provato a sostituirlo geom_line()con geom_line(aes(group = year))ma non ha funzionato.

In una risposta mi è stato detto di convertire l'anno in una variabile fattore. L'ho fatto e il problema persiste. Questo è l'output di str(df)e dput(df):

'data.frame':   4 obs. of  2 variables:
 $ year     : num  1 2 3 4
 $ pollution: num [1:4(1d)] 346.8 134.3 130.4 88.3
  ..- attr(*, "dimnames")=List of 1
  .. ..$ : chr  "1999" "2002" "2005" "2008"

structure(list(year = c(1, 2, 3, 4), pollution = structure(c(346.82, 
134.308821199349, 130.430379885892, 88.275457392443), .Dim = 4L, .Dimnames = list(
    c("1999", "2002", "2005", "2008")))), .Names = c("year", 
"pollution"), row.names = c(NA, -4L), class = "data.frame")

Non dà alcun errore quando lo eseguo. È probabile che dfnon sia quello che pensi che sia. Si prega di indicare la domanda in forma riproducibile, ovvero mostrare l'output di dput(df).
G. Grothendieck,

potrebbe essere che le tue variabili siano fattori, quindi dovrai convertirle in numerici
barbabietola

@ G.Grothendieck ho pubblicato quello che hai detto. Ho anche convertito in numerico e ho ancora il problema.
megashigger,

Dovresti davvero porre domande in forma riproducibile. È difficile aiutarti se non riusciamo a ricreare l'errore.
Mario Becerra,

Risposte:


344

Devi solo aggiungere group = 1in ggplot o geom_line aes ().

Per i grafici a linee, i punti dati devono essere raggruppati in modo che sappia quali punti collegare. In questo caso, è semplice: tutti i punti devono essere collegati, quindi group = 1. Quando vengono utilizzate più variabili e vengono disegnate più linee, il raggruppamento per linee viene in genere eseguito per variabile.

Riferimento: Ricettario per R, Capitolo: Grafici Bar_and_line_graphs_ (ggplot2), Grafici a linee.

Prova questo:

plot5 <- ggplot(df, aes(year, pollution, group = 1)) +
         geom_point() +
         geom_line() +
         labs(x = "Year", y = "Particulate matter emissions (tons)", 
              title = "Motor vehicle emissions in Baltimore")

Da notare, il raggruppamento deve essere fatto con l' groupargomento. Raggruppare solo per esempio colornon sarebbe sufficiente.
Ho

questa risposta è ancora valida? L'aggiunta di group = 1 in estetica non sembra funzionare più.
Giacomo,

@Giacomo - funziona per me, su 3.6.2 su un Mac. Stava ricevendo il temuto avvertimento, ma l'aggiunta di group = 1 risolveva il problema. ggplot (lakemeta, mapping = aes (x = Lake, y = Area, group = 1)) + geom_line (size = 2, color = "blue")
Jenn D.

27

Questo errore viene visualizzato perché una delle variabili è in realtà una variabile fattore. Eseguire

str(df) 

per controllare questo. Quindi fai questa doppia modifica variabile per mantenere i numeri dell'anno invece di trasformarli in numeri di livello "1,2,3,4":

df$year <- as.numeric(as.character(df$year))

EDIT: sembra che data.frame abbia una variabile di classe "array" che potrebbe causare il pb. Prova quindi:

df <- data.frame(apply(df, 2, unclass))

e trama di nuovo?


3
Questa è per me una risposta conveniente perché risolve il problema dalla radice
Medhat

1
Buona risposta per prevenire questo avviso!
Mihai,

2

Ho avuto un problema simile con il frame di dati:

group time weight.loss
1 Control  wl1    4.500000
2    Diet  wl1    5.333333
3  DietEx  wl1    6.200000
4 Control  wl2    3.333333
5    Diet  wl2    3.916667
6  DietEx  wl2    6.100000
7 Control  wl3    2.083333
8    Diet  wl3    2.250000
9  DietEx  wl3    2.200000

Penso che la variabile per l'asse x dovrebbe essere numerica, in modo che geom_line sappia come collegare i punti per disegnare la linea.

dopo aver modificato la seconda colonna in numerica:

 group time weight.loss
1 Control    1    4.500000
2    Diet    1    5.333333
3  DietEx    1    6.200000
4 Control    2    3.333333
5    Diet    2    3.916667
6  DietEx    2    6.100000
7 Control    3    2.083333
8    Diet    3    2.250000
9  DietEx    3    2.200000

allora funziona.


1

Avvia R in una nuova sessione e incollalo in:

library(ggplot2)

df <- structure(list(year = c(1, 2, 3, 4), pollution = structure(c(346.82, 
134.308821199349, 130.430379885892, 88.275457392443), .Dim = 4L, .Dimnames = list(
    c("1999", "2002", "2005", "2008")))), .Names = c("year", 
"pollution"), row.names = c(NA, -4L), class = "data.frame")

df[] <- lapply(df, as.numeric) # make all columns numeric

ggplot(df, aes(year, pollution)) +
           geom_point() +
           geom_line() +
           labs(x = "Year", 
                y = "Particulate matter emissions (tons)", 
                title = "Motor vehicle emissions in Baltimore")

Avvia R in una nuova sessione e incolla il codice nel mio post.
G. Grothendieck,

Hai capito questo problema. Ho lo stesso problema con il tuo, che ho solo un valore per ogni valore x. Aspetto la tua risposta. Grazie.
Hoang Le

0

Ho ricevuto un prompt simile. Era perché avevo specificato l'asse x in termini di percentuale (ad esempio: 10% A, 20% B, ....). Quindi un approccio alternativo potrebbe essere quello di moltiplicare questi valori e scriverli nella forma più semplice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.