web-dev-qa-db-fra.com

Comment superposer des nuages ​​de points dans R?

Si j'ai trois ensembles de données:

a1= rnorm(10)
a2= rnorm(10)
a3= rnorm(10)

plutôt que de les regarder côte à côte en utilisant:

par(mfrow=c(1,3))
plot(a1)
plot(a2)
plot(a3)

Comment obtenir tous ces points sur le même tracé?

12
Cath Penfold

Utilisez simplement la fonction points:

plot(a1)
points(a2, col=2)
points(a3, col=3)

Cela équivaut à:

plot(1:length(a1), a1)
points(1:length(a2), a2, col=2)
points(1:length(a3), a3, col=3)

Si les vecteurs ont des longueurs inégales, vous devez spécifier la limite de l'axe des x:

plot(a1, xlim=c(1, max(length(a1), length(a2), length(a3))))
26
csgillespie
# To overlay scatterplots in R

# import the required libraries
library(ggplot2)
library(reshape2)

# assign data
a1=rnorm(10)
a2=rnorm(10)
a3=rnorm(10)

# create a dataframe from combined data
# and set count to however many points are in each dataset
df = data.frame(a1, a2, a3, count = c(1:10))

# melt the dataframe
df.m = melt(df, id.vars ="count", measure.vars = c("a1","a2","a3"))

# take a look at what melt() does to get an idea of what is going on
df.m

# plot out the melted dataframe using ggplot
ggplot(df.m, aes(count, value, colour = variable)) + geom_point() + ylim(-3,3)

# swapping the axis
ggplot(df.m, aes(value, count, colour = variable)) + geom_point() + xlim(-3,3)

Quand a1 et a3 sont de taille égale, il n'est pas possible de mettre dans le même data.frame en colonnes, en entrée pour melt. La solution est d'utiliser simplement un list:

a1 = rnorm(10)
a2 = rnorm(25)
a3 = rnorm(17)
a_list = list(a1, a2, a3)
a_df = do.call("rbind", lapply(a_list, 
                                function(x) data.frame(value = x, 
                                                       count = seq_along(x))))
ID_options = LETTERS[seq_along(a_list)]
a_df$ID = rep(ID_options, sapply(a_list, length))
ggplot(a_df, aes(x = value, y = count, color = ID)) + geom_point()

enter image description here

8
Cath Penfold

Pour ajouter de la variété aux réponses, vous pouvez également utiliser lattice. Ici, la deuxième ligne de chaque ensemble d'échantillons de code représente des axes échangés.

library(lattice)

## If you have already created the "df" 
##   data.frame from your example
xyplot(count ~ a1 + a2 + a3, data=df)
xyplot(a1 + a2 + a3 ~ count, data=df)

## Without first creating the "df" 
##   data.frame from your example    
xyplot(1:10 ~ a1 + a2 + a3)
xyplot(a1 + a2 + a3 ~ 1:10)

Si vous travaillez avec des vecteurs de longueurs inégales, vous pouvez charger les fonctions à partir de cette réponse que j'ai partagée à propos de cbinding vecteurs de longueurs inégales puis utiliser la première approche que j'ai mentionnée. Mettre à jour: Voir https://Gist.github.com/mrdwab/6789277 pour les versions les plus récentes de la fonction.

Exemple:

a1 = rnorm(10)
a2 = rnorm(25)
a3 = rnorm(17)

library(lattice)
library(devtools)
## source_Gist is not working properly unless you provide 
##   the full URL to the "raw" file
source_Gist("https://Gist.github.com/mrdwab/6789277/raw/9bd7d5931389ec475c49c1918d26d9899796a5d0/Cbind.R")

newdf <- Cbind(a1, a2, a3)
xyplot(a1 + a2 + a3 ~ sequence(nrow(newdf)), data=newdf)
xyplot(sequence(nrow(newdf)) ~ a1 + a2 + a3, data=newdf)

Voici un exemple de tracé avec quelques ajustements aux couleurs par défaut:

xyplot(sequence(nrow(newdf)) ~ a1 + a2 + a3, data=newdf, 
       pch = 21, fill = c("black", "red", "green"), cex = 1)

enter image description here

3