Quelle est la bonne façon d'utiliser R pour créer un nuage de points qui sépare les données par traitement?

30

Je suis très nouveau avec R et les statistiques en général, mais je dois faire un nuage de points qui, je pense, pourrait dépasser ses capacités natives.

J'ai quelques vecteurs d'observations et je veux faire un nuage de points avec eux, et chaque paire appartient à une catégorie sur trois. Je voudrais faire un nuage de points qui sépare chaque catégorie, soit par couleur soit par symbole. Je pense que ce serait mieux que de générer trois diagrammes de dispersion différents.

J'ai un autre problème avec le fait que dans chacune des catégories, il y a de grands groupes à un moment donné, mais les groupes sont plus grands dans un groupe que dans les deux autres.

Quelqu'un connaît-il une bonne façon de procéder? Paquets que je dois installer et apprendre à utiliser? Quelqu'un a fait quelque chose de similaire?

Merci

crf
la source

Réponses:

53

grands clusters : si la surimpression est un problème, vous pouvez soit utiliser un alpha inférieur, donc les points uniques sont sombres, mais le surimpression rend les couleurs plus intenses. Ou vous passez à des histogrammes 2D ou à des estimations de densité.

require ("ggplot2")
  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, colour = Species)) + stat_density2d ()
    densité
    Vous voudriez probablement prendre cela en compte ...

  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, fill = Species)) + stat_binhex (bins=5, aes (alpha = ..count..)) + facet_grid (. ~ Species)
    hexbin
    Bien que vous puissiez produire cette intrigue également sans facettes, l'ordre de primage des espèces influe sur l'image finale.

  • Vous pouvez éviter cela si vous êtes prêt à vous salir les mains (= lien vers l'explication et le code) et calculer les couleurs mélangées pour les hexagones: entrez la description de l'image ici

  • Une autre chose utile est d'utiliser des bacs (hex) pour les zones à haute densité et de tracer des points uniques pour d'autres pièces:

    ggplot (df, aes (x = date, y = t5)) + 
      stat_binhex (data = df [df$t5 <= 0.5,], bins = nrow (df) / 250) +
          geom_point (data = df [df$t5 > 0.5,], aes (col = type), shape = 3) +
      scale_fill_gradient (low = "#AAAAFF", high = "#000080") +
      scale_colour_manual ("response type", 
        values = c (normal = "black", timeout = "red")) + 
      ylab ("t / s")

    entrez la description de l'image ici


Par souci d'exhaustivité des packages de traçage, permettez-moi également de mentionner lattice:

require ("lattice")
  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Species, iris, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length, iris, groups = iris $ Species, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Species, iris, groups = iris $ Species, pch = 20) </code>

cbeleites soutient Monica
la source
Charmant! Merci beaucoup, les bacs hexagonaux ont parfaitement fait l'affaire!
crf
22

C'est l'un des problèmes classiques de l'ensemble de données «Iris». Il s'agit d'un lien vers tout un ensemble de projets de traçage basés sur cet ensemble de données avec le code R, que vous pourrez peut-être adapter à votre problème.

Voici une approche qui utilise avec la base R plutôt qu'avec un module complémentaire.

plot(iris$Petal.Length, iris$Petal.Width, pch=21, 
     bg=c("red","green3","blue")[unclass(iris$Species)], 
     main="Edgar Anderson's Iris Data")

ce qui produit ce chiffre:

entrez la description de l'image ici

À partir de là, en fonction de votre intrigue, vous pouvez commencer à jouer avec les niveaux alpha / transparence pour permettre le surplotage, etc. mais je construirais d'abord à partir d'un graphique très basique.

Bien qu'il existe de nombreuses raisons de s'en tenir à la base R, d'autres packages simplifient le traçage. La séparation des données par une caractéristique distinctive est l'une des forces des packages ggplot2 et treillis . ggplot2 crée des graphiques particulièrement attrayants. Les deux packages sont illustrés dans la réponse de @cbeleites.

Fomite
la source
4
Un peu déroutant car bien que vous recommandiez ggplot2, vous ne l'utilisez pas dans votre exemple? Une bibliothèque woudl be équivalente à ggplot2 (ggplot2); qplot (Petal.Length, Petal.Width, color = Species, data = iris, main = "Edgar Anderson's Iris Data"). Cela a également l'avantage de produire automatiquement une légende.
Peter Ellis
@PeterEllis C'est parce que même si je peux reconnaître quelque chose qui se prête bien à ggplot2, je ne suis que passivement compétent avec les graphiques de base.
Fomite
1
Super astuce avec unclass () dans les graphiques de base BTW
Peter Ellis
16

Ou avec ggplot2:

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) + geom_point()
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + facet_grid(~Species)

Qui produit

entrez la description de l'image ici

entrez la description de l'image ici

Roman Luštrik
la source