2017-10-18 10 views
0

j'ai une données avec 4 variables qui ressemble à:Affichage étiquette correcte à ggplot en utilisant une variable différente

id|name|year|value| 
1 A 16 500 
1 A 15 400 
1 A 14 430 
2 B 16 200 
2 B 15 180 
2 B 14 170 
3 A 16 620 
3 A 15 510 
3 A 14 200 

puis, je dois créer dans ggplot un graphique en ligne temporelle pour chaque identifiant, mais montrant son étiquette au lieu de son identifiant. Ce que je faisais était:

ggplot(db, aes(x=year, y= value)) + geom_line() + facet_wrap(~db$id) 

mais il montre les graphiques écrits leurs ids au lieu de leur nom, alors j'ai essayé:

ggplot(db, aes(x=year, y= value)) + geom_line() + facet_wrap(~db$name) 

Il a créé les graphiques en ligne avec leurs étiquettes correctes, mais id 1 et id 3 ont tous deux le même nom, donc, à la fin, il a créé seulement 2 graphiques au lieu de 3 avec l'un d'eux avec 6 observations au lieu de 3.

Existe-t-il un moyen de concaténer le nom avec id? puis faites par nom corrigé par la concaténation id.

+0

Il est plus probable que nous serons en mesure de vous aider si vous fournissez un [exemple reproductible complète minimale] (http://stackoverflow.com/help/mcve) pour aller avec votre question. Quelque chose que nous pouvons travailler et utiliser pour vous montrer comment il pourrait être possible de répondre à votre question. –

+0

Eh bien, ce que je viens de montrer est minime, complète et vérifiable. – gustavomoty

+1

Voir l'exemple dans '? Labeller':" _ # Ou utilisez des vecteurs de caractères comme tables de recherche: _ ". Par exemple. 'lab <- c (" 1 "=" A "," 2 "=" B "," 3 "=" A ")'; 'facet_wrap (~ id, étiqueteuse = étiqueteuse (id = lab))' – Henrik

Répondre

0

Mise à jour:

Créer une colonne name et id combiné appelé name2 avec id sur une nouvelle ligne, puis graphique.

db$name2 <- paste(db$name,db$id,sep="\n") 

ggplot(db, aes(x=year, y= value)) + geom_line() + facet_wrap(~name2) 

enter image description here

Vous pouvez le faire comme ceci:

ggplot(db, aes(x=year, y= value)) + 
    geom_line() + 
    facet_wrap(~interaction(id, name)) 

Ce qui crée un tableau distinct pour chaque combinaison de nom et id. Si vous voulez exclure les 1. et 2., nous devrons ajuster la solution.

données:

db <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), name = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L), .Label = c("A", "B"), class = "factor"), 
    year = c(16L, 15L, 14L, 16L, 15L, 14L, 16L, 15L, 14L), value = c(500L, 
    400L, 430L, 200L, 180L, 170L, 620L, 510L, 200L)), .Names = c("id", 
"name", "year", "value"), class = "data.frame", row.names = c(NA, 
-9L)) 
+0

cela a fonctionné parfaitement! Cependant, ce serait bien de laisser tomber .1 et .2. – gustavomoty

+0

ou si nous faisons l'étiquette dans deux lignes fonctionne, parce que je n'ai pas réellement ces ids et noms, mais identifie et nomme beaucoup plus gros dans certains cas. Donc, si nous mettons le nom en première ligne, sauter et puis id dans la deuxième ligne, serait le scénario parfait. – gustavomoty

+0

@gustavomoty voir ma mise à jour! – Mako212

0

Marko212's answer est certainement mieux. Cependant, dans le cas où vous avez besoin de concaténer name avec id à un certain point futur.

dta <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), 
     name = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L), 
     .Label = c("A", "B"), class = "factor"), 
     year = c(16L, 15L, 14L, 16L, 15L, 14L, 16L, 15L, 14L), 
     value = c(500L, 400L, 430L, 200L, 180L, 170L, 620L, 510L, 200L)), 
     .Names = c("id", "name", "year", "value"), 
     class = "data.frame", row.names = c(NA, -9L)) 

dta$name_id <- with(dta, paste0(id, name)) 
dta 
#> id name year value name_id 
#> 1 1 A 16 500  1A 
#> 2 1 A 15 400  1A 
#> 3 1 A 14 430  1A 
#> 4 2 B 16 200  2B 
#> 5 2 B 15 180  2B 
#> 6 2 B 14 170  2B 
#> 7 3 A 16 620  3A 
#> 8 3 A 15 510  3A 
#> 9 3 A 14 200  3A