El gráfico de líneas ggplot2 proporciona "geom_path: cada grupo consta de una sola observación. ¿Necesitas ajustar la estética del grupo?

170

Con este marco de datos ("df"):

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

Intento crear un gráfico de líneas como este:

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

El error que obtengo es:

geom_path: cada grupo consta de una sola observación. ¿Necesitas ajustar la estética del grupo?

El gráfico aparece como un diagrama de dispersión aunque quiero un gráfico de líneas. Traté de reemplazar geom_line()con geom_line(aes(group = year))pero eso no funcionó.

En una respuesta, me dijeron que convirtiera el año en una variable de factor. Lo hice y el problema persiste. Esta es la salida de str(df)y 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")
megashigger
fuente
No da ningún error cuando lo ejecuto. Es probable que dfno sea lo que crees que es. Indique su pregunta en forma reproducible, es decir, muestre el resultado de dput(df).
G. Grothendieck
podría ser que sus variables son factores, entonces necesitaría convertirlas a números
remolacha
@ G.Grothendieck Publiqué lo que dijiste. También me convertí a numérico y todavía tengo el problema.
Megashigger
Realmente deberías formular preguntas en forma reproducible. Es difícil ayudarlo si no podemos recrear el error.
Mario Becerra

Respuestas:

344

Solo tiene que agregar group = 1a ggplot o geom_line aes ().

Para los gráficos de líneas, los puntos de datos deben agruparse para que sepa qué puntos conectar. En este caso, es simple: todos los puntos deben estar conectados, por lo que group = 1. Cuando se usan más variables y se dibujan varias líneas, la agrupación de líneas generalmente se realiza por variable.

Referencia: Cookbook for R, Capítulo: Graphs Bar_and_line_graphs_ (ggplot2), Line graphs.

Prueba esto:

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")
Mario Barbé
fuente
Cabe destacar que la agrupación debe hacerse con el groupargumento. La agrupación única por ejemplo, colorno sería justo sufficient.I tenido este problema y espero que esto ayude a alguien corriendo a la misma
Tjebo
¿Esta respuesta sigue siendo válida? Agregar group = 1 en la estética ya no parece funcionar.
Giacomo
@Giacomo: funciona para mí, en 3.6.2 en una Mac. Estaba recibiendo la temida advertencia, pero agregar group = 1 solucionó el problema. ggplot (lakemeta, mapping = aes (x = Lake, y = Area, group = 1)) + geom_line (size = 2, color = "blue")
Jenn D.
27

Obtiene este error porque una de sus variables es en realidad una variable de factor. Ejecutar

str(df) 

para comprobar esto Luego haga este cambio de doble variable para mantener los números del año en lugar de transformarlos en números de nivel "1,2,3,4":

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

EDITAR: parece que su data.frame tiene una variable de clase "matriz" que podría causar el pb. Intenta entonces:

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

y trama de nuevo?

agenis
fuente
3
Esta es para mí una respuesta conveniente porque soluciona el problema desde la raíz
Medhat
1
¡Buena respuesta para evitar esta advertencia!
Mihai
2

Tuve un problema similar con el marco de datos:

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

Creo que la variable para el eje x debería ser numérica, de modo que geom_line sepa cómo conectar los puntos para dibujar la línea.

después de cambiar la segunda columna a numérica:

 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

entonces funciona

Xin Niu
fuente
1

Inicie R en una nueva sesión y péguelo en:

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")
G. Grothendieck
fuente
Inicie R en una sesión nueva y pegue el código en mi publicación.
G. Grothendieck
¿Has resuelto este problema? Tengo el mismo problema con el tuyo, que solo tengo un valor para cada valor x. Esperando por tu respuesta. Gracias.
Hoang Le
0

Tengo un aviso similar. Fue porque había especificado el eje x en términos de algún porcentaje (por ejemplo: 10% A, 20% B, ...). Entonces, un enfoque alternativo podría ser que multiplique estos valores y los escriba en la forma más simple.

Areeha
fuente