2012-09-23 2 views
1

Je suis nouveau à R et je voudrais savoir comment générer des histogrammes pour la situation suivante:Génération « 2D » histogramme en R

J'ai d'abord une table de fréquence régulière avec 2 colonnes: La colonne A est la catégorie (ou bin) et la colonne B est le nombre de cas qui tombent dans cette catégorie

Col A Col B 
1-10  7 
11-20  4 
21-30  5 

a partir de ce tableau de fréquence initiale, je crée une table avec 3 colonnes: Col a est à nouveau la catégorie (ou bin), mais maintenant le Col B est la "fraction du total des cas", donc pour la catégorie 1-10, la colonne B aura la valeur 7/(7 + 4 + 5) = 7/16. Maintenant il y a aussi une troisième colonne, Col C qui est "fraction du nombre total de cas tombant entre les catégories 1-20", donc pour 1-10, la valeur pour Col C serait 7/(7 + 4) = 7/11 . Le tableau complet devrait ressembler à celui ci-dessous:

Col A Col B Col C 
1-10  7/16  7/11 
11-20  4/16  4/11 
21-30  5/16  0 

Comment générer un histogramme à partir de ce tableau à trois colonnes ci-dessus? Mon axe X devrait être le bin (1-10, 11-20 etc.) et mon axe Y devrait être la fraction, mais pour chaque bin j'ai deux fractions (Col B et Col C), donc il y aura deux fractions " barres "pour chaque bin dans l'histogramme.

Toute aide serait grandement appréciée.

Répondre

2

Les données:

dat <- data.frame(A = c("1-10", "11-20", "21-30"), B = c(7, 4, 5)) 

Maintenant, calculer les proportions et créer un nouvel objet:

dat2 <- rbind(B = dat$B/sum(dat$B), C = c(dat$B[1:2]/sum(dat$B[1:2]), 0)) 
colnames(dat2) <- dat$A 

Terrain:

barplot(dat2, beside = TRUE, legend = rownames(dat2)) 

enter image description here

1

Votre tit le devrait être remplacé par "Histogramme 2D", car les histogrammes ont une échelle continue sur l'axe x contrairement au graphique à barres et sont utilisés pour comparer les distributions de données univariées ou les distributions de données univariées modélisées sur le facteur dépendant. Vous essayez de comparer colB vs colC qui peut être visualisé efficacement en utilisant un diagramme de dispersion 2D mais pas avec un histogramme. La meilleure façon de comparer les distributions de colB et de colC en utilisant des histogrammes serait de tracer deux histogrammes séparément et de vérifier le changement d'emplacement des points de données.

Si vous souhaitez comparer les distributions de colB et de colC, essayez le code suivant: J'ai arrondi les valeurs pour obtenir des données raisonnables selon votre description de données. Notez qu'un échantillonnage aléatoire par permutation est en cours et chaque fois que vous exécutez le même code, il y aura un léger changement dans la distribution, mais cela n'affectera pas l'inférence de la distribution entre colB et colC.

library("ggplot2") 
# 44 datapoints between 1-10 
a <- rep(1:10, 4) 
a <- c(a, sample(a, size=4, replace=FALSE)) 
# 25 datapoints between 11-20 
b <- rep(11:20, 2) 
b <- c(b, sample(b, size=5, replace=FALSE)) 
# 31 datapoints between 21-30 
c <- rep(21:30, 3) 
c <- c(c, sample(c, size=1, replace=FALSE)) 
colB <- c(a, b, c) 
# 64 datapoints between 1-10 
a <- rep(1:10, 6) 
a <- c(a, sample(a, size=4, replace=FALSE)) 
# 36 datapoints between 11-20 
b <- rep(11:20, 3) 
b <- c(b, sample(b, size=6, replace=FALSE)) 
colC <- c(a, b) 
df <- data.frame(cbind(colB, colC=colC)) 
write.table(df, file = "data") 
data <- read.table("data", header=TRUE) 
data 
ggplot(data=data, aes(x=colB, xmin=1, xmax=30)) + stat_bin(binwidth = 1) 
ggplot(data=data, aes(x=colC, xmin=1, xmax=30)) + stat_bin(binwidth = 1) 

# if you want density distribution, then you can try something like this: 
ggplot(data=data, aes(x=colB, y = ..density.., xmin=1, xmax=30)) + stat_bin(binwidth = 1) 
ggplot(data=data, aes(x=colC, y = ..density.., xmin=1, xmax=30)) + stat_bin(binwidth = 1) 

HTH -Sathish