2015-04-28 13 views
5

Próbuję wygenerować histogram z niżej danychR - histogram wewnątrz histogramu

a 11 
a 14 
a 23 
b 12 
b 21 
c 17 
c 14 
c 29 
c 22 
c 25 

To jest mój cel działki

enter image description here Wygląda na to, że może zrobić coś takiego z ggplot ale nie mam ggplot w moim systemie. Czy można go wygenerować bez ggplota?

+2

Wygląda na to, że chcesz policzyć wystąpienia w zakresie 10-20 i 20-30? Po co przy okazji. nie install.packages ("ggplot2")? –

+0

dlaczego nie możesz pobrać ggplot2? – miles2know

+1

Pracuję na serwerze, na którym nie mam zbyt dużej kontroli. Potrzeba długiego czasu/wysiłku/eskalacji, aby coś zrobić na tych zdalnych serwerach – SAN

Odpowiedz

4

Aktualizacja

Oto lepsza wersja kodu, który można łatwiej dostosować do dowolnego numeru waha się oddzielić przez:

dat <- data.frame(c1 = c("a", "a", "a", "b", "b", rep("c", 5)), c2=c(11, 14, 23, 12, 21, 17, 14, 29, 22, 25)) 

groups <- levels(dat$c1) 
nranges <- 2 
limits <- c(10, 20, 30) #Must have length equal to nranges + 1 
intervals <- sapply(1:nranges, function(i) paste0(limits[i], "-", limits[i+1])) 

frequencies <- sapply(1:nranges, function(i) sapply(groups, function(j) sum(dat[dat$c2>limits[i] & dat$c2<limits[i+1],1]==j))) 
# Or using table(). One of them might be faster than the other for large data 
#frequencies <- sapply(1:nranges, function(i) rowSums(table(dat[dat$c2>limits[i] & dat$c2<limits[i+1],]))) 

barplot(frequencies, beside = TRUE, col=1:length(groups), names.arg=intervals) 

wynik jest taki sam, jak poniżej, w różnych kolorach i odpowiednie etykiety dla grup:

enter image description here

Original

To może nie być idealnym miejscem na rzeczywistych danych, ale działa dla próbki i daje start:

dat <- data.frame(c1 = c("a", "a", "a", "b", "b", rep("c", 5)), c2=c(11, 14, 23, 12, 21, 17, 14, 29, 22, 25)) 

groups <- levels(dat$c1) 
dat1 <- sapply(groups, function(i) sum(dat[dat$c2>10 & dat$c2<20,1]==i)) 
dat2 <- sapply(groups, function(i) sum(dat[dat$c2>20 & dat$c2<30,1]==i)) 

barplot(matrix(c(dat1, dat2), ncol=2), beside = TRUE, col=c("Red", "Green", "Blue")) 

który generuje:

enter image description here

Pomysł polega na obliczeniu częstotliwości, a następnie narysowaniu ich za pomocą barplota ze skumulowanymi danymi obok siebie, zamiast próbować użyć hist().