164 votes

Nuage de points avec histogrammes marginaux dans ggplot2

Est-il un moyen de créer des nuages de points marginales avec les histogrammes comme dans l'exemple ci-dessous, en ggplot2? Dans Matlab, il est l' scatterhist() fonction et il existe des équivalents pour les R ainsi. Cependant, je n'en ai pas vu pour ggplot2.

scatterplot with marginal histograms

J'ai commencé une tentative par la création de la seule graphiques, mais ne savent 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 de les ranger avec la fonction de posté ici. Mais pour faire une longue histoire courte: Est-il un moyen de créer ces graphiques?

137voto

BondedDust Points 105234

Ce n'est pas une réponse complètement réactive mais c'est très simple. Il illustre une autre méthode d'affichage des densités marginales et explique également comment utiliser les niveaux alpha pour une sortie graphique prenant en charge la transparence:

 scatter <- qplot(x,y, data=xy)  + 
         scale_x_continuous(limits=c(min(x),max(x))) + 
         scale_y_continuous(limits=c(min(y),max(y))) + 
         geom_rug(col=rgb(.5,0,0,alpha=.2))
scatter
 

entrez la description de l'image ici

102voto

oeo4b Points 698

Le `` paquet devrait fonctionner ici. Commencez par faire chacun des objets ggplot :

Puis utilisez la fonction grid.arrange :

plot

52voto

Nyitrai Lőrinc Points 362

Un outre, juste pour gagner du temps de recherche pour les gens qui font cela après nous.

Légendes, des étiquettes d’axe, axe textes, tiques font les parcelles éloignés de l’autre, donc votre terrain ressemblera laid et incompatibles.

Vous pouvez corriger cela en utilisant certains de ces paramètres de thème,

et aligner les échelles,

Si les résultats seront penchera OK :

an example

31voto

Ben Points 8166

Juste un très variation mineure sur DWin de répondre, dans l'esprit général de marginal indicateurs de distribution.

Edward Tufte a appelé cette utilisation de tapis de parcelles d'un "point-tiret complot', et a un exemple dans VDQI de l'aide de l'axe des lignes pour indiquer la plage de chaque variable. Dans mon exemple, les étiquettes de l'axe et les lignes de la grille indiquent également la distribution des données. Les étiquettes sont situées sur les valeurs de Tukey cinq nombre résumé (au minimum inférieur de la charnière, la médiane supérieure de la charnière, maximum), donnant une impression rapide de la propagation de chaque variable. Ces cinq numéros sont donc une représentation numérique d'une boîte à moustaches. C'est un peu compliqué parce que le inégalement espacées d'une grille de lignes suggèrent que les axes non-linéaire de l'échelle (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 à être à leur emplacement habituel, et laissez les étiquettes indiquent le nombre cinq sommaire.

x<-rnorm(300)
y<-rt(300,df=10)
xy<-data.frame(x,y)

require(ggplot2); require(grid)
# make the basic plot object
ggplot(xy, aes(x, y)) +        
  # set the locations of the x-axis labels as Tukey's five numbers   
  scale_x_continuous(limit=c(min(x), max(x)), 
                     breaks=round(fivenum(x),1)) +     
  # ditto for y-axis labels 
  scale_y_continuous(limit=c(min(y), max(y)),
                     breaks=round(fivenum(y),1)) +     
  # specify points
  geom_point() +
  # specify that we want the rug plot
  geom_rug(size=0.1) +   
  # improve the data/ink ratio
  theme_set(theme_minimal(base_size = 18))

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X