Existe-t-il un moyen de créer des nuages de points avec des histogrammes marginaux, comme dans l'exemple ci-dessous ggplot2
? Dans Matlab, c'est la scatterhist()
fonction et il existe également des équivalents pour R. Cependant, je ne l'ai pas vu pour ggplot2.
J'ai commencé une tentative en créant les graphiques uniques mais je ne sais pas comment les organiser correctement.
require(ggplot2)
x<-rnorm(300)
y<-rt(300,df=2)
xy<-data.frame(x,y)
xhist <- qplot(x, geom="histogram") + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 5/16, axis.text.y = theme_blank(), axis.title.y=theme_blank(), background.colour="white")
yhist <- qplot(y, geom="histogram") + coord_flip() + opts(background.fill = "white", background.color ="black")
yhist <- yhist + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 16/5, axis.text.y = theme_blank(), axis.title.y=theme_blank() )
scatter <- qplot(x,y, data=xy) + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y)))
none <- qplot(x,y, data=xy) + geom_blank()
et les organiser avec la fonction affichée ici . Mais pour faire court: existe-t-il un moyen de créer ces graphiques?
Réponses:
Le
gridExtra
package devrait fonctionner ici. Commencez par créer chacun des objets ggplot:Ensuite, utilisez la fonction grid.arrange:
la source
xy <- data.frame(x=rnorm(300), y=rt(300,df=2) )
et de l'utiliserdata=xy
dans les appels ggplot.Ce n'est pas une réponse complètement réactive mais c'est très simple. Il illustre une autre méthode pour afficher les densités marginales et comment utiliser les niveaux alpha pour une sortie graphique prenant en charge la transparence:
la source
C'est peut-être un peu tard, mais j'ai décidé de créer un package (
ggExtra
) pour cela car il impliquait un peu de code et pouvait être fastidieux à écrire. Le paquet essaie également de résoudre certains problèmes courants, comme s'assurer que même s'il y a un titre ou que le texte est agrandi, les tracés seront toujours alignés les uns avec les autres.L'idée de base est similaire à ce que les réponses ont donné ici, mais cela va un peu plus loin. Voici un exemple de la façon d'ajouter des histogrammes marginaux à un ensemble aléatoire de 1000 points. J'espère que cela facilitera l'ajout d'histogrammes / tracés de densité à l'avenir.
Lien vers le package ggExtra
la source
Un ajout, juste pour gagner du temps de recherche pour les personnes qui font cela après nous.
Les légendes, les étiquettes d'axes, les textes des axes, les graduations font que les tracés s'éloignent les uns des autres, de sorte que votre intrigue aura l'air moche et incohérente.
Vous pouvez corriger cela en utilisant certains de ces paramètres de thème,
et aligner les échelles,
donc les résultats sembleront OK:
la source
Juste une très petite variation de la réponse de BondedDust , dans l'esprit général des indicateurs marginaux de distribution.
Edward Tufte a appelé cette utilisation des tracés de tapis un «tracé point-tiret», et a un exemple dans VDQI d'utilisation des lignes d'axe pour indiquer la plage de chaque variable. Dans mon exemple, les étiquettes des axes et les lignes de la grille indiquent également la distribution des données. Les étiquettes sont situées aux valeurs du résumé à cinq chiffres de Tukey (minimum, charnière inférieure, médiane, charnière supérieure, maximum), donnant une impression rapide de la répartition de chaque variable.
Ces cinq nombres sont donc une représentation numérique d'un boxplot. C'est un peu délicat car les lignes de grille espacées de manière inégale suggèrent que les axes ont une échelle non linéaire (dans cet exemple, ils sont linéaires). Il serait peut-être préférable d'omettre les lignes de la grille ou de les forcer à se trouver à des emplacements réguliers, et de laisser simplement les étiquettes afficher le résumé à cinq chiffres.
la source
Comme il n'y avait pas de solution satisfaisante pour ce type d'intrigue lors de la comparaison de différents groupes, j'ai écrit une fonction pour le faire.
Il fonctionne pour les données groupées et non groupées et accepte des paramètres graphiques supplémentaires:
la source
J'ai trouvé le package (
ggpubr
) qui semble très bien fonctionner pour ce problème et il considère plusieurs possibilités pour afficher les données.Le lien vers le package est ici , et dans ce lien, vous trouverez un joli tutoriel pour l'utiliser. Par souci d'exhaustivité, je joins l'un des exemples que j'ai reproduits.
J'ai d'abord installé le package (il nécessite
devtools
)Pour l'exemple particulier d'affichage de différents histogrammes pour différents groupes, il mentionne en relation avec
ggExtra
: "Une limitation deggExtra
est qu'il ne peut pas faire face à plusieurs groupes dans le nuage de points et les graphiques marginaux. Dans le code R ci-dessous, nous fournissons un solution en utilisant lecowplot
package. " Dans mon cas, j'ai dû installer ce dernier package:Et j'ai suivi ce morceau de code:
Ce qui a bien fonctionné pour moi:
Iris set nuage de points histogrammes marginaux
la source
shape = 19
dansggscatter
. Codes pour les formes iciVous pouvez facilement créer des nuages de points attrayants avec des histogrammes marginaux à l'aide de ggstatsplot (il ajustera et décrira également un modèle):
Ou un peu plus attrayant (par défaut) ggpubr :
METTRE À JOUR:
Comme suggéré par @aickley, j'ai utilisé la version de développement pour créer l'intrigue.
la source
C'est une vieille question, mais j'ai pensé qu'il serait utile de poster une mise à jour ici car j'ai rencontré ce même problème récemment (merci à Stefanie Mueller pour l'aide!).
La réponse la plus positive utilisant gridExtra fonctionne, mais l'alignement des axes est difficile / piraté, comme cela a été souligné dans les commentaires. Cela peut maintenant être résolu en utilisant la commande ggMarginal du package ggExtra, comme tel:
la source
J'ai essayé ces options, mais je n'ai pas été satisfait des résultats ou du code désordonné qu'il faudrait utiliser pour y arriver. Heureusement pour moi, Thomas Lin Pedersen vient de développer un package appelé patchwork , qui fait le travail de manière assez élégante.
Si vous souhaitez créer un nuage de points avec des histogrammes marginaux, vous devez d'abord créer ces trois graphiques séparément.
La seule chose qui reste à faire est d'ajouter ces parcelles avec un simple
+
et de spécifier la mise en page avec la fonctionplot_layout()
.La fonction
plot_spacer()
ajoute un tracé vide dans le coin supérieur droit. Tous les autres arguments doivent être explicites.Étant donné que les histogrammes dépendent fortement de la largeur de zone choisie, on pourrait dire qu'il faut préférer les graphiques de densité. Avec quelques petites modifications, on obtiendrait par exemple pour les données de suivi oculaire un beau tracé.
Bien que les données ne soient pas fournies à ce stade, les principes sous-jacents doivent être clairs.
la source
Pour construire sur la réponse de @ alf-pascu, configurer chaque parcelle manuellement et les organiser avec
cowplot
offre une grande flexibilité en ce qui concerne à la fois les parcelles principales et marginales (par rapport à certaines des autres solutions). Les distributions par groupes en sont un exemple. Changer le tracé principal en un tracé de densité 2D en est une autre.Ce qui suit crée un nuage de points avec des histogrammes marginaux (correctement alignés).
Pour tracer un tracé de densité 2D à la place, changez simplement le tracé principal.
la source
Une autre solution utilisant
ggpubr
etcowplot
, mais ici nous créons des tracés en utilisantcowplot::axis_canvas
et les ajoutons au tracé d'origine aveccowplot::insert_xaxis_grob
:la source
De nos jours, il existe au moins un package CRAN qui crée le nuage de points avec ses histogrammes marginaux.
la source
Vous pouvez utiliser la forme interactive de
ggExtra::ggMarginalGadget(yourplot)
et choisir entre des boîtes à moustaches, des graphiques de violon, des graphiques de densité et des histogrammes avec facilité.comme ça
la source