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.