2016-10-22 1 views
6

Je me demandais s'il y avait un moyen de soustraire deux diagrammes de dispersion binés l'un de l'autre dans R. J'ai deux distributions avec les mêmes axes et je veux les superposer et les soustraire produire un nuage de points de différence.R - nuage de points de différence

Voici mes deux parcelles:

enter image description hereenter image description here

et mon script pour les parcelles:

library(hexbin) 
library(RColorBrewer) 

setwd("/Users/home/") 
df <- read.table("data1.txt") 
x <-df$c2 
y <-df$c3 

bin <-hexbin(x,y,xbins=2000) 
my_colors=colorRampPalette(rev(brewer.pal(11,'Spectral'))) 
d <- plot(bin, main="" , colramp=my_colors, legend=F) 

Des conseils sur la façon d'aller à ce sujet serait très utile.

EDIT trouvé une autre façon de le faire:

xbnds <- range(x1,x2) 
ybnds <- range(y1,y2) 
bin1 <- hexbin(x1,y1,xbins= 200, xbnds=xbnds,ybnds=ybnds) 
bin2 <- hexbin(x2,y2,xbins= 200, xbnds=xbnds,ybnds=ybnds) 
erodebin1 <- erode.hexbin(smooth.hexbin(bin1)) 
erodebin2 <- erode.hexbin(smooth.hexbin(bin2)) 
hdiffplot(erodebin1, erodebin2) 
+2

Vous avez seulement créé une parcelle. Lisez des exemples de construction de données simulées et ajoutez du code à votre corps de quesiton qui produit deux ensembles de données qui ressemblent à ce que vous utilisez. –

Répondre

7

D'accord, comme point de départ, voici quelques exemples de données. Chacun est aléatoire, avec un décalé à (2,2).

df1 <- 
    data.frame(
    x = rnorm(1000) 
    , y = rnorm(1000) 
) 

df2 <- 
    data.frame(
    x = rnorm(1000, 2) 
    , y = rnorm(1000, 2) 
) 

Pour veiller à ce que les bacs sont identiques, il est préférable de construire un objet hexbin. Pour ce faire, j'utilise le bind_rows de dplyr pour garder une trace de quelles données proviennent les données (ce serait encore plus facile si vous aviez un seul data.frame avec une variable de regroupement).

bothDF <- 
    bind_rows(A = df1, B = df2, .id = "df") 


bothHex <- 
    hexbin(x = bothDF$x 
     , y = bothDF$y 
     , IDs = TRUE 
     ) 

Ensuite, nous utilisons un mélange de hexbin et dplyr pour compter les occurrences de chacun dans chaque cellule. Tout d'abord, appliquer à travers les bacs, la construction d'une table (doit utiliser factor pour s'assurer que tous les niveaux sont affichés, pas nécessaire si votre colonne est déjà un facteur). Ensuite, il le simplifie et construit un data.frame qui est ensuite manipulé avec mutate pour calculer la différence de nombre, puis rejoint une table qui donne les valeurs x et y pour chacun des identifiants.

counts <- 
    hexTapply(bothHex, factor(bothDF$df), table) %>% 
    simplify2array %>% 
    t %>% 
    data.frame() %>% 
    mutate(id = as.numeric(row.names(.)) 
     , diff = A - B) %>% 
    left_join(data.frame(id = [email protected], hcell2xy(bothHex))) 

head(counts) donne:

A B id diff   x   y 
1 1 0 7 1 -1.3794467 -3.687014 
2 1 0 71 1 -0.8149939 -3.178209 
3 1 0 79 1 1.4428172 -3.178209 
4 1 0 99 1 -1.5205599 -2.923806 
5 2 0 105 2 0.1727985 -2.923806 
6 1 0 107 1 0.7372513 -2.923806 

Enfin, nous utilisons ggplot2 pour tracer les données résultantes, car il offre plus de contrôle (et la possibilité d'utiliser plus facilement une autre variable que compte comme remplit) que hexbin lui-même.

counts %>% 
    ggplot(aes(x = x, y = y 
      , fill = diff)) + 
    geom_hex(stat = "identity") + 
    coord_equal() + 
    scale_fill_gradient2() 

enter image description here

De là, il est facile de jouer avec des haches, des couleurs, etc.