2010-11-01 13 views
0

Dites que j'ai deux facteurs et je veux les représenter graphiquement sur la même intrigue, les deux facteurs ont les mêmes niveaux.Tracer deux facteurs sur le même graphique

s1 <- c(rep("male",20), rep("female", 30)) 
s2 <- c(rep("male",10), rep("female", 40)) 
s1 <- factor(s1, levels=c("male", "female")) 
s2 <- factor(s2, levels=c("male", "female")) 

J'aurais pensé que l'utilisation de la fonction de table aurait produit le résultat correct mais pour la représentation graphique ressorte.

table(s1, s2) 
     s2 
s1  male female 
male  10  10 
female 0  30 

Alors, vraiment deux questions, quelle est la fonction de table fait pour obtenir ce résultat et ce que d'autres fonctions puis-je utiliser pour créer un graphique avec 2 séries en utilisant les fonctions avec les mêmes niveaux?

Aussi, si c'est un facteur, j'utilise barplot2 dans le paquet gplots pour le représenter graphiquement.

+0

Votre 3e ligne devrait être s1 <- facteur (s1, niveaux = c ("masculin", "féminin")). Aussi, quel type d'intrigue attendez-vous? Si vous tracez (table (s1, s2)), vous obtiendrez un graphique mosaïque du tableau de contingence. – Greg

+0

Ah désolé, j'étais insouciant quand je dactylographiais les données d'échantillon ici. J'espérais avoir un barplot avec chaque s1 et s2 mappé sur le même graphique montrant le nombre d'occurrences entre mâle et femelle. –

Répondre

5

Vous pouvez obtenir des résultats un peu plus détaillées avec le paquet de treillis:

s1 <- factor(c(rep("male",20), rep("female", 30))) 
s2 <- factor(c(rep("male",10), rep("female", 40))) 
D <- data.frame(s1, s2) 

library(lattice) 
histogram(~s1+s2, D, col = c("pink", "lightblue")) 

alt text

Ou si vous voulez hommes/femmes côte à côte pour faciliter la comparaison:

t1 <- table(s1) 
t2 <- table(s2) 
barchart(cbind(t1, t2), stack = F, horizontal = F) 

alt text

+1

Vous devriez vraiment spécifier l'ordre des facteurs dans l'appel 'factor'. Ce serait mieux d'avoir les garçons en bleu et les filles en rose;) (+1 de toute façon!) – nico

+0

@nico Bon sens de la couleur :). Corrigée. – VitoshKa

+0

J'aime les treillis comme Homer S. aime la bière. Donc je vous donne un +1. :) –

3

De ?table:

« table » utilise les facteurs recoupements pour construire une table contingence des comptes à chaque combinaison de niveaux de facteur.

Quand vous faites table(s1,s2) ce qui se passe est que la fonction considère s1 et s2 comme paires de résultats. Effectivement, il vous dit que si vous deviez prendre cbind(s1,s2) alors il y aurait 10 rangées de mâle-mâle, 10 de mâle-femelle et ainsi de suite.

Pour comprendre cela, considérons un exemple très trivial:

a <- c("M","M","F","F") 
b <- c("F","F","M","M") 
table(a,b) 

    b 
a F M 
    F 0 2 
    M 2 0 

Ce que vous devez faire est:

t1 <- table(s1) 
t2 <- table(s2) 
barplot(cbind(t1,t2), beside=TRUE, col=c("lightblue", "salmon")) 
3

Deux options produisant des formes légèrement différentes des parcelles sont

plot(s1, s2) 

et

plot(table(s1,s2)) 

Le premier est un spineplot un cas particulier de la parcelle de mosaïque, que la méthode plot pour table produit (le deuxième exemple). Voir ?spineplot et ?mosaicplot pour plus de détails et vous pouvez utiliser ces fonctions directement, plutôt que le générique plot() si vous le souhaitez.

Jetez aussi un coup d'œil à la fonction mosaic() dans le paquet vcd sur CRAN par Meyer et al (Link to vcd on CRAN)

table() produit le contingency table pour les deux facteurs.

+0

Ce n'est pas ce qu'il cherche. Il a simplement besoin d'appeler 'table' deux fois. – nico

+0

@nico - les deux graphiques dessinent les deux facteurs sur la même intrigue. Ces vues des données fournissent des descriptions alternatives (sans doute meilleures) du type de données que Cam B a montré. Je n'ai pas remarqué que dans son * commentaire * il a demandé spécifiquement un barplot. –

+0

@nico - Je répondais spécifiquement à cette partie de Q de Cam: "quelle autre fonction puis-je utiliser pour créer un graphique avec 2 séries en utilisant des fonctions avec les mêmes niveaux?" –

1

Hmm .. Je ne pense pas créer un table de contingence est ce que Cameron cherchait. Si je l'ai bien compris, je pense qu'il voulait créer une trame de données avec deux variables, où s1 et s2 semblent être des vecteurs de la même taille. (longueur (s1) == longueur (s2)).

Dans ce cas, il aurait simplement besoin de créer une « table » (je pense qu'il voulait dire data.frame) en utilisant:

df = data.frame(s1=s1, s2=s2); 

Et puis tracer la série 2 dans la même parcelle.

En ce qui concerne la deuxième question de tracer ces choses, j'utiliserais matplot. Par exemple:

matplot(1:10, data.frame(a=rnorm(10), b=rnorm(10)), type="l", lty=1, lwd=1, col=c("blue","red")) 

Étant donné qu'il a ses données de 2 vecteurs organisés en un seul data.frame nommé "df", il peut simplement quelque chose comme:

matplot(df, type="l", lty=1, lwd=1, col=c("blue","red")) 

Hope this helps.