2010-04-02 4 views
11

Dans R, étant donné un vecteurComment tracer des données groupées par un facteur, mais pas comme boxplot

casp6 <- c(0.9478638, 0.7477657, 0.9742675, 0.9008372, 0.4873001, 0.5097587, 0.6476510, 0.4552577, 0.5578296, 0.5728478, 0.1927945, 0.2624068, 0.2732615) 

et un facteur:

trans.factor <- factor (rep (c("t0", "t12", "t24", "t72"), c(4,3,3,3))) 

Je veux créer un terrain où les données les points sont regroupés comme défini par le facteur. Les catégories doivent donc être sur l'axe des x, les valeurs de la même catégorie doivent avoir la même coordonnée x.

Simplement faire plot(trans.factor, casp6) fait presque ce que je veux, il produit un boxplot, mais je veux voir les points de données individuels.

+0

Êtes-vous lié à l'intrigue? Je sais que c'est possible en utilisant ggplot2. – PaulHurleyuk

+0

Pas du tout. Dans quel paquet se trouve ggplot2? – amarillion

+2

Comme Jonathan a répondu, ggplot2 vous laissera faire cela, et vous laissera jitter les points de façon à ce que deux points ne se chevauchent pas s'ils ont la même valeur y. Consultez le site Web de Hadley http://had.co.nz/ggplot2/ – PaulHurleyuk

Répondre

12
require(ggplot2) 
qplot(trans.factor, casp6) 
+0

Court et doux, merci :) – amarillion

4

Vous pouvez le faire avec ggplot2, en utilisant facets. Quand je lis "Je veux créer une parcelle où les points de données sont groupés comme défini par le facteur", la première chose qui me vient à l'esprit est facets.

Mais dans ce cas particulier, alternative plus rapide devrait être:

plot(as.numeric(trans.factor), casp6) 

et vous pouvez jouer avec des options de terrain après (type, fg, bg ...), mais je vous recommande de coller avec ggplot2, puisqu'il a beaucoup de code propre, une grande fonctionnalité, vous pouvez éviter le surplaqué ... etc

Apprenez comment faire face à des facteurs. Vous avez barplot lors de l'évaluation plot(trans.factor, casp6) parce que trans.factor était classe de factor (ironiquement, vous même dans ce manoir nommé) ... et trans.factor, en tant que telle, a été déclaré avant une variable continue (numérique) dans la fonction plot() ... par conséquent plot() "ressent" la nécessité de sous-ensembles de données et de dessiner des boîtes à moustaches en fonction de chaque partie (si vous déclarez une variable continue en premier, vous obtiendrez un graphique ordinaire, n'est-ce pas?). ggplot2, d'autre part, le facteur interprète d'une manière différente ... comme « un ordinaire », variable numérique (ce qui signifie la syntaxe fournie par Jonathan Chang, vous devez spécifier geom lorsque vous faites quelque chose plus complexe dans ggplot2) . Mais supposons que vous ayez une variable continue et un facteur, et que vous souhaitiez appliquer un histogramme sur chaque partie de la variable continue, définie par les niveaux de facteur. C'est là que les choses se compliquent avec les capacités du graphique de base.

# create dummy data 
> set.seed(23) 
> x <- rnorm(200, 23, 2.3) 
> g <- factor(round(runif(200, 1, 4))) 

En utilisant des graphiques de base (package:graphics):

par(mfrow = c(1, 4)) 
tapply(x, g, hist) 

ggplot2 façon:

qplot(x, facets = . ~ g) 

Essayez de le faire avec graphics dans une ligne de code (points-virgules et des fonctions personnalisées sont considérés comme tricherie!):

qplot(x, log(x), facets = . ~ g) 

Espérons que je ne t'ai pas ennuyé à mort, mais je t'ai aidé!

Cordialement,
aL3xa

3

Vous pourriez être en mesure de se rapprocher de ce que vous voulez utiliser des graphiques en treillis en faisant:

library(lattice)  
xyplot(casp6 ~ trans.factor, 
     scales = list(x = list(at = 1:4, labels = levels(trans.factor)))) 
3

Je pense qu'il ya une meilleure solution (je l'ai écrit pour un atelier il y a quelques jours), mais ça m'a échappé. Voici un substitut moche avec des graphiques de base. N'hésitez pas à annoter l'axe des x ad libitum. Personnellement, j'aime la solution de Greg.

plot(0, 0, xlim = c(1, 4), ylim = range(casp6), type = "n") 
points(casp6 ~ trans.factor) 
2

Aucun paquet supplémentaire nécessaire

Je suis un peu en retard à la fête, mais je trouve que vous pouvez obtenir le résultat souhaité très facilement avec le tracé standard fonction - il suffit de convertir le facteur en une valeur numérique:

plot(as.numeric(trans.factor), casp6) 
+0

Rapide et facile! Cela nécessite plus de votes – theforestecologist

Questions connexes