web-dev-qa-db-fra.com

Le graphique en courbes de ggplot2 donne "geom_path: chaque groupe est constitué d'une seule observation. Avez-vous besoin d'ajuster l'esthétique du groupe?"

Avec ce cadre 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 ceci:

  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 je reçois est:

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

Le graphique apparaît sous la forme d'un nuage de points même si je souhaite un graphique en courbes. 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. Voici le résultat 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")
131
megashigger

Vous devez seulement ajouter group = 1 dans le ggplot ou geom_line aes ().

Pour les graphiques linéaires, les points de données doivent être regroupés de manière à ce qu'il sache quels points connecter. Dans ce cas, c'est simple - tous les points doivent être connectés, donc groupe = 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, Chapitre: Graphes Bar_and_line_graphs_ (ggplot2), Graphes linéaires.

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")
269
Mario Barbé

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, effectuez ce changement de variable double pour conserver les numéros d’année au lieu de les transformer en nombres de niveau "1,2,3,4":

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

EDIT: il semble que votre data.frame ait une variable de classe "array" pouvant causer le pb. Essayez alors:

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

et complot à nouveau?

20
agenis

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")
1
G. Grothendieck

J'ai eu un problème similaire avec le cadre 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 des x devrait être numérique, afin que geom_line sache connecter les points pour tracer 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.

0
user3446619