2015-11-27 1 views
1

J'essaie de tracer les valeurs médianes de certaines données sur une distribution de densité en utilisant la bibliothèque ggplot2 R. Je voudrais imprimer les valeurs médianes comme texte sur le dessus de la parcelle de densité.valeurs médianes de la courbe au-dessus d'une distribution de densité dans ggplot2

Vous verrez ce que je veux dire par un exemple (en utilisant la trame de données par défaut « diamants »):

diamond price per cut

J'impression trois itmes: la parcelle de densité elle-même, une ligne verticale montrant la prix médian de chaque coupe, et une étiquette de texte avec cette valeur. Mais, comme vous pouvez le voir, les prix médians se chevauchent sur l'axe "y" (cette esthétique est obligatoire dans la fonction geom_text()).

Est-il possible d'attribuer dynamiquement une valeur "y" à chaque prix médian, afin de les imprimer à différentes hauteurs? Par exemple, à la valeur de densité maximale de chaque "coupe".

Jusqu'à présent, j'ai ce

# input dataframe 
dia <- diamonds 

# calculate mean values of each numerical variable: 
dia_me <- ddply(dia, .(cut), numcolwise(median)) 

ggplot(dia, aes(x=price, y=..density.., color = cut, fill = cut), legend=TRUE) + 
    labs(title="diamond price per cut") + 
    geom_density(alpha = 0.2) + 
    geom_vline(data=dia_me, aes(xintercept=price, colour=cut), 
      linetype="dashed", size=0.5) + 
    scale_x_log10() + 
    geom_text(data = dia_me, aes(label = price, y=1, x=price)) 

(j'assignant une valeur constante à l'esthétique y dans la fonction geom_text parce qu'il est obligatoire)

Merci beaucoup à l'avance!

+0

Pourquoi la valeur constante pour y obligatoire? Vous pourriez envisager de créer une position y dans votre dataframe 'dia_me'. – Heroka

+0

Je reçois une erreur me le disant quand je l'omets. Et oui, je suppose que ce serait la solution, mais pour un tracé de densité, les données sont transformées, donc je ne connais pas le moyen d'obtenir la valeur maximale, par exemple. (ce qui serait plus facile dans un histogramme parce que je traçais directement mes valeurs, sans les transformer). – XGrau

Répondre

4

Cela peut être un début (mais ce n'est pas très lisible en raison des couleurs). Mon idée était de créer une position «y» à l'intérieur des données utilisées pour tracer les lignes pour les médianes. C'est un peu arbitraire, mais je voulais que les positions y soient entre 0.2 et 1 (pour bien cadrer avec l'intrigue). Je l'ai fait par la séquence-commande. Puis j'ai essayé de le commander (je n'ai pas fait beaucoup de bien) par le prix médian; c'est arbitraire.

#scatter y-pos over plot 
dia_me$y_pos <- seq(0.2,1,length.out=nrow(dia_me))[order(dia_me$price,decreasing = T)] 


ggplot(dia, aes(x=price, y=..density.., color = cut, fill = cut), legend=TRUE) + 
    labs(title="diamond price per cut") + 
    geom_density(alpha = 0.2) + 
    geom_vline(data=dia_me, aes(xintercept=price, colour=cut), 
      linetype="dashed", size=0.5) + 
    scale_x_log10() + 
    geom_text(data = dia_me, aes(label = price, y=y_pos, x=price)) 

enter image description here

+0

Bien! Cela correspond parfaitement à la facture, merci. Pourriez-vous s'il vous plaît expliquer la syntaxe un peu? Si je comprends bien, vous ordonnez les valeurs médianes de plus haut à plus bas et vous leur attribuez des valeurs de 1 à 0,2? – XGrau

+1

J'ai modifié la réponse. – Heroka

+1

Vous pouvez également utiliser les maxima de vos densités avec ce code: 'dia_me $ y_pos <- aggregate (log10 (prix) ~ couper, dia, fonction (x) max (densité (x) $ y)) [, 2]' – Jimbou