Le graphique linéaire ggplot2 donne «geom_path: Chaque groupe se compose d'une seule observation. Avez-vous besoin d'ajuster l'esthétique du groupe? »

170

Avec cette trame de données ("df"):

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

J'essaie de créer un graphique en courbes comme celui-ci:

  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'erreur que j'obtiens est:

geom_path: chaque groupe se compose d'une seule observation. Avez-vous besoin d'ajuster l'esthétique du groupe?

Le graphique apparaît sous forme de nuage de points même si je souhaite un graphique linéaire. J'ai essayé de remplacer geom_line()par geom_line(aes(group = year))mais cela n'a pas fonctionné.

Dans une réponse, on m'a dit de convertir l'année en une variable factorielle. Je l'ai fait et le problème persiste. Ceci est la sortie de str(df)et 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")
mégashigger
la source
Cela ne donne aucune erreur lorsque je l'exécute. Ce dfn'est probablement pas ce que vous pensez. Veuillez formuler votre question sous une forme reproductible, c'est-à-dire afficher la sortie de dput(df).
G. Grothendieck
pourrait être que vos variables sont des facteurs, alors vous devez les convertir en numérique
betterave
@ G.Grothendieck J'ai posté ce que vous avez dit. J'ai également converti en numérique et j'ai toujours le problème.
megashigger
Vous devriez vraiment poser les questions sous une forme reproductible. Il est difficile de vous aider si nous ne pouvons pas recréer l'erreur.
Mario Becerra

Réponses:

344

Vous n'avez qu'à ajouter group = 1dans le ggplot ou geom_line aes ().

Pour les graphiques linéaires, les points de données doivent être regroupés afin qu'il sache à quels points se connecter. Dans ce cas, c'est simple - tous les points doivent être connectés, donc group = 1. Lorsque plus de variables sont utilisées et que plusieurs lignes sont dessinées, le regroupement des lignes est généralement effectué par variable.

Référence: Cookbook for R, Chapter: Graphs Bar_and_line_graphs_ (ggplot2), Line graphs.

Essaye ça:

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é
la source
Il est à noter que le regroupement doit être fait avec l' groupargument. Regrouper uniquement par exemple par colorne serait pas suffisant.J'ai juste eu ce problème et j'espère que cela aidera quelqu'un à
tomber
cette réponse est-elle toujours valable? L'ajout de group = 1 dans l'esthétique ne semble plus fonctionner.
Giacomo le
@Giacomo - fonctionne pour moi, sur 3.6.2 sur un Mac. Obtenait l'avertissement redouté, mais l'ajout de group = 1 a résolu le problème. ggplot (lakemeta, mapping = aes (x = Lake, y = Area, group = 1)) + geom_line (size = 2, color = "blue")
Jenn D.
27

Vous obtenez cette erreur car l'une de vos variables est en fait une variable de facteur. Exécuter

str(df) 

pour vérifier cela. Ensuite, faites ce changement de variable double pour conserver les numéros d'année au lieu de les transformer en numéros de niveau "1,2,3,4":

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

EDIT: il apparaît que votre data.frame a une variable de classe "array" qui pourrait provoquer le pb. Essayez alors:

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

et comploter à nouveau?

Agenis
la source
3
C'est pour moi une réponse pratique car elle résout le problème à la racine
Medhat
1
Bonne réponse pour éviter cet avertissement!
Mihai
2

J'ai eu un problème similaire avec la trame de données:

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

Je pense que la variable pour l'axe x devrait être numérique, de sorte que geom_line sache comment connecter les points pour dessiner la ligne.

après avoir changé la 2ème colonne en numérique:

 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

alors ça marche.

Xin Niu
la source
1

Démarrez R dans une nouvelle session et collez-le dans:

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
la source
Démarrez R dans une nouvelle session et collez-y le code dans mon message.
G. Grothendieck
Avez-vous compris ce problème. J'ai le même problème avec le vôtre que je n'ai qu'une valeur pour chaque valeur x. J'attend votre réponse. Merci.
Hoang Le
0

J'ai eu une invite similaire. C'était parce que j'avais spécifié l'axe des x en termes de pourcentage (par exemple: 10% A, 20% B, ....). Une autre approche pourrait donc être de multiplier ces valeurs et de les écrire sous la forme la plus simple.

Areeha
la source