2017-09-04 4 views
4

Je contiennent des données discrètes qui ressemble à ceci:Comment utiliser sec_axis() pour des données discrètes dans ggplot2 R?

height <- c(1,2,3,4,5,6,7,8) 
weight <- c(100,200,300,400,500,600,700,800) 
person <- c("Jack","Jim","Jill","Tess","Jack","Jim","Jill","Tess") 
set <- c(1,1,1,1,2,2,2,2) 
dat <- data.frame(set,person,height,weight) 

Je suis en train de tracer un graphique avec la même axe x (personne) et 2 différents axes y (poids et taille). Tous les exemples, je trouve est d'essayer de tracer le secondary axis (sec_axis), ou des données discrètes en utilisant des graphiques de base. Existe-t-il un moyen facile d'utiliser sec_axis pour des données discrètes sur ggplot2? Edit: Quelqu'un dans les commentaires a suggéré que j'essaie la réponse suggérée. Cependant, je lance dans cette erreur maintenant

Voici mon code actuel:

p1 <- ggplot(data = dat, aes(x = person, y = weight)) + 
    geom_point(color = "red") + facet_wrap(~set, scales="free") 
p2 <- p1 + scale_y_continuous("height",sec_axis(~.*1.2, name="height")) 
p2 

I get the error: Error in x < range[1] : 
    comparison (3) is possible only for atomic and list types 

Alternativement, maintenant je l'ai modifié l'exemple pour correspondre this example posted.

p <- ggplot(dat, aes(x = person)) 
p <- p + geom_line(aes(y = height, colour = "Height")) 

# adding the relative weight data, transformed to match roughly the range of the height 
p <- p + geom_line(aes(y = weight/100, colour = "Weight")) 

# now adding the secondary axis, following the example in the help file ?scale_y_continuous 
# and, very important, reverting the above transformation 
p <- p + scale_y_continuous(sec.axis = sec_axis(~.*100, name = "Relative weight [%]")) 

# modifying colours and theme options 
p <- p + scale_colour_manual(values = c("blue", "red")) 
p <- p + labs(y = "Height [inches]", 
       x = "Person", 
       colour = "Parameter") 
p <- p + theme(legend.position = c(0.8, 0.9))+ facet_wrap(~set, scales="free") 
p 

Je reçois une erreur qui dit

"geom_path: Each group consists of only one observation. Do you need to 
adjust the group aesthetic?" 

Je reçois le modèle, mais aucun point ne se voit

+0

Ce sont des données continues (nombres), non discrètes (catégories). – Brian

+0

J'ai réalisé que j'ai lié la source incorrecte. J'ai lié le bon et mis à jour ma réponse avec l'erreur, si je l'utilise – Ash

+0

Ajoutez 'sec.axis =' devant votre 'sec_axis (...)'. Sans nommer l'argument explicitement, il a par défaut le deuxième argument dans 'scale_y_continuous()', & 'breaks = sec_axis (~. * 1.2, name =" height ")' déclenche cette erreur car cela n'a aucun sens dans le contexte. –

Répondre

0

Les arguments de fonction R sont introduits par position si les noms d'arguments ne sont pas explicitement spécifiés. Comme mentionné par @ Z.Lin dans les commentaires, vous avez besoin sec.axis= avant votre sec_axis fonction pour indiquer que vous alimentez cette fonction dans l'argument sec.axis de scale_y_continuous. Si vous ne le faites pas, il sera introduit dans le deuxième argument de scale_y_continuous, qui par défaut est breaks=. Le message d'erreur est donc lié à ce pas d'alimentation dans un type de données acceptables pour l'argument breaks:

p1 <- ggplot(data = dat, aes(x = person, y = weight)) + 
    geom_point(color = "red") + facet_wrap(~set, scales="free") 
p2 <- p1 + scale_y_continuous("weight", sec.axis = sec_axis(~.*1.2, name="height")) 
p2 

![enter image description here

Le premier argument (name=) de scale_y_continuous est pour le premier échelle y, où comme l'argument sec.axis= est pour la seconde échelle y. J'ai changé le nom de votre première échelle pour corriger cela.

+0

Mais cela ne semble pas représenter le poids et la taille. J'ai besoin que le poids et la hauteur soient tracés sur le même axe x. – Ash

+0

@Ash C'est juste l'étiquette qui n'est pas spécifiée correctement. Voir ma réponse éditée. – useR

+0

Non, je ne pense pas que vous voyez ce que je veux dire. Pour chaque personne, par exemple. En Set1, pour Jack je devrais voir deux points, un qui correspond à sa taille (dis marqué en rouge) et l'autre à son poids (dis marqué en noir). Au lieu de cela, l'intrigue donne un seul point, peut-être une relation entre le poids et la taille? Ce n'est pas ce que je veux. – Ash