2017-08-23 1 views
1

J'essaie de visualiser un sous-ensemble à 3 niveaux de mes données dans une figure pour deux traitements différents. Je veux visualiser la distribution de l'âge pour seulement un an (2007), pour un seul article (tatouage), et pour les femelles et les mâles séparément.Superposer deux sous-ensembles ou plus dans la même parcelle

Je suis en mesure de réduire mon ensemble de données que les femmes, seulement en 2007, et seulement pour les tatouages ​​en utilisant:

with(data[(data$sex=="F") & (data$yy=="2007") & (data$item=="tattoo"),], plot(age, xlab="Age of Females", ylab="Frequency")) 

Avec ce code, je suis en mesure de voir une distribution de fréquence de mes données. 3 tier subset

Mais, je ne suis pas, en utilisant ce code, faire deux choses:

  1. visualiser les données en tant que parcelle de densité

  2. incruster sous-ensemble plusieurs niveaux pour les hommes

Le plus proche que j'ai pu venir est d'utiliser ce code:

library(sm) 
sm.density.compare(age, sex, xlab="Age (years)") 
legend(50,0.12, c("Female","Male"), col=c("red", "green"), pch=c(16,16), title="Sex", box.lty=0) 

Il donne ce chiffre: Density plot

Mais, avec ce code, je ne peux pas obtenir les données soient limitées à l'année 2007 et les tatouages ​​seulement.

Ma question est double:

  1. Est-il possible de superposer les données relatives aux hommes (pour 2007 et tatouages) sur les données de fréquence des femmes? Comment puis-je limiter les données de densité à 2007 et aux tatouages ​​uniquement?

J'ai rendu un sous-ensemble de mes données disponible here. MISE À JOUR: Pour l'histogramme de fréquence, j'essaie de visualiser les données avec les barres pour les femelles et les mâles adjacentes les unes aux autres pour chaque bin.

+0

Pour obtenir la parcelle de terrain densité utilisation '(densité (your_data_subset))'. Si vous voulez ajouter des diagrammes de densité supplémentaires, utilisez 'lines', par exemple:' lines (density (your_second_data_subset)) ' –

Répondre

2

à la norme R-vous tracer pouvez le faire comme suit

with(data[(data$sex=="F") & (data$yy=="2007") & (data$item=="tattoo"),], plot(density(age))) 
with(data[(data$sex=="M") & (data$yy=="2007") & (data$item=="tattoo"),], lines(density(age), col = "red")) 
segments(50,0.1,52,0.1, col = "black") 
text(52,0.1, pos = 4, labels = "Female") 
segments(50,0.09,52,0.09, col = "red") 
text(52,0.09, pos = 4, labels = "Male") 

enter image description here

Une alternative lisse est d'utiliser ggplot2 et le paquet easyGgplot2 par Kassambara

library(devtools) 
install_github("kassambara/easyGgplot2") 
library(easyGgplot2) 
library(ggplot2) 
my.subset <- data[(data$yy=="2007") & (data$item=="tattoo"),] 
ggplot2.histogram(data=my.subset, xName='age',binwidth = 2, 
        groupName='sex', legendPosition="top", 
        alpha=0.5, position="identity") 

enter image description here

+0

Lorsque j'essaie d'exécuter la première ligne que vous avez suggérée, l'erreur que j'obtiens est: Erreur dans density.default (age): l'argument 'x' doit être numérique –

+1

lire vos données de cette façon 'data <- read.delim (" data30g .txt ", header = TRUE, as.is = TRUE)' –

+0

Cela a résolu le problème! Votre réponse pour la partie 2 de ma question a fonctionné. Pourriez-vous avoir des suggestions sur la partie 1 (tracé de fréquence) de ma question? –

0

Je suggérerais de sous-traiter les données d'ici 2007 et de les tatouer avant de tracer.

date <- c(rep(2006-07-15,7),rep(2007-07-15,14)) 
yy <- c(rep(2006,7), rep(2007,14)) 
sex <- c(rep("F",4),"M", "M",rep("F",4),rep("M",4),rep("F",3),rep("M",4)) 
item <- c(rep("piercing",8), rep("tattoo",5), "jewel",rep("tattoo",7)) 
age <- c(rep(22,8), rep(25,3), rep(34,2), 41, 37,rep(28,2), rep(31,3), 39) 

df <- data.frame(date,yy,sex,item,age) 
df2 <- subset(df, df$yy == 2007 & df$item == "tattoo") 


d <- density(df2$age[df2$sex=='F']) 
plot(d, main="Density", xlab="Age", col="red") 
lines(density(df2$age[df2$sex=='M']), col="blue") 

legend("topright", legend=c("Female","Male"), col=c("red","blue"), lty=c(1,1), title="Sex") 

enter image description here

Si vous voulez superposer les parcelles d'histogramme au lieu, vous pouvez utiliser ceci:

hist(df2$age[df2$sex=='F'], col=rgb(1,0,0,0.5), main="Histogram", xlab="Age") 
hist(df2$age[df2$sex=='M'], col=rgb(0,0,1,0.5), add=T) 

enter image description here

Si vous voulez obtenir le côté Histogrammes côte à côte, c'est un peu plus compliqué dans la base R.Voici le code:

breaks <- pretty(range(c(df2$age[df2$sex=='F'], df2$age[df2$sex=='M'])), n=10) 
h1 <- hist(df2$age[df2$sex=='F'], breaks=breaks, plot=F)$counts 
h2 <- hist(df2$age[df2$sex=='M'], breaks=breaks, plot=F)$counts 
new_h <- rbind(h1,h2) 
colnames(new_h) <- paste(breaks[-length(breaks)], breaks[-1], sep="-") 

barplot(new_h, beside=TRUE, main="Histogram", xlab="Age") 

enter image description here

+0

J'ai du mal à comprendre comment exécuter mon code sans avoir à le restreindre à 40 ans, comme vous ' J'ai fait ici. Lorsque j'essaie d'exécuter le code sans limiter les données comme vous l'avez fait, j'obtiens une erreur à propos de l'argument 'x' n'étant pas numérique. Aussi, pour l'histogramme, est-il possible de tracer les poubelles adjacentes les unes aux autres plutôt que les unes sur les autres? –

+0

J'ai utilisé des données d'échantillon (donc pas de restriction à 40 ans). Vous devriez vérifier que l'âge est numérique dans votre base de données. Oui, il est possible de les mettre à côté. Je vais modifier ma réponse pour montrer ce code. – user108363

+0

Merci d'avoir modifié votre réponse pour montrer cela. Je vais essayer ça aussi! –

1

Utilisez density pour obtenir des parcelles de densité et lines d'ajouter des parcelles seconde densité ou plus

plot(density(data[data$sex=="F" & data$yy=="2007" & data$item=="tattoo" ,]), col="red") 
lines(density(data[data$sex=="M" & data$yy=="2007" & data$item=="tattoo" ,]), col="green")