2010-10-05 9 views
15

Mam dane, które są w większości wyśrodkowane w niewielkim zakresie (1-10), ale istnieje znaczna liczba punktów (np. 10%), które są w (10-1000). Chciałbym wykreślić histogram dla tych danych, które skupią się na (1-10), ale również pokażą dane (10-1000). Coś w rodzaju skali logarytmicznej dla histogramu.W jaki sposób można wykreślić histogram długich danych za pomocą R?

Tak, wiem, to znaczy nie wszystkie pojemniki są jednakowej wielkości

Prosty hist(x) daje alt text podczas hist(x,breaks=c(0,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,3,4,5,7.5,10,15,20,50,100,200,500,1000,10000))) daje alt text

z których żadna nie jest to, co chcę.

aktualizacja następujące odpowiedzi tutaj teraz produkować coś, co jest prawie dokładnie to, co chcę (I poszedł z ciągłym działki zamiast bar-histogram):

breaks <- c(0,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,4,8) 
ggplot(t,aes(x)) + geom_histogram(colour="darkblue", size=1, fill="blue") + scale_x_log10('true size/predicted size', breaks = breaks, labels = breaks)![alt text][3] 

alt text Jedynym problemem jest chciałbym dopasować skalę i faktyczne pręty, które zostały narysowane. Są dwie opcje: po prostu użyj rzeczywistych marginesów kreślonych taktów (jak?), Następnie uzyskaj "brzydkie" etykiety osi X, takie jak 1.1754,1.2985 itd. Drugim, który wolę, jest kontrolowanie faktycznego wykorzystują marginesy na baty, aby dopasować przerwy.

+0

@Marek moje pytanie logować oś x (lub podobną), nie wartości (oś y) –

+0

@David My bad. Cofnięcie;) – Marek

+0

możliwy duplikat: http://stackoverflow.com/questions/1245273/histogram-with-logarithmic-scale –

Odpowiedz

7

Korzystanie z ggplot2 wydaje się najłatwiejszą opcją.Jeśli chcesz mieć większą kontrolę nad swoimi osiami i przerw, można zrobić coś jak poniżej:

EDIT: nowy kod pod warunkiem

x <- c(rexp(1000,0.5)+0.5,rexp(100,0.5)*100) 

breaks<- c(0,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000,10000) 
major <- c(0.1,1,10,100,1000,10000) 


H <- hist(log10(x),plot=F) 


plot(H$mids,H$counts,type="n", 
     xaxt="n", 
     xlab="X",ylab="Counts", 
     main="Histogram of X", 
     bg="lightgrey" 
) 
abline(v=log10(breaks),col="lightgrey",lty=2) 
abline(v=log10(major),col="lightgrey") 
abline(h=pretty(H$counts),col="lightgrey") 
plot(H,add=T,freq=T,col="blue") 
#Position of ticks 
at <- log10(breaks) 

#Creation X axis 
axis(1,at=at,labels=10^at) 

To jest tak blisko, jak mogę dostać się do ggplot2. Umieszczenie szarego tła nie jest proste, ale możliwe do wykonania, jeśli zdefiniujesz prostokąt o rozmiarze ekranu wydruku i ustawisz tło jako szare.

Sprawdź wszystkie używane funkcje, a także ?par. Umożliwi to tworzenie własnych wykresów. Mam nadzieję że to pomoże.

alt text

+0

breaks definiuje miejsce, w którym umieścisz tyknięcia i etykiety, główne definicje, w których umieszczasz główne linie pionowe.Z dodatkowym kodem, możesz dodać tiki i linie tam, gdzie chcesz, dodatkową oś polecenia() z etykietami = NA Czy podoba mi się ta gra? –

+0

+1 dziękuję Joris za wszelką pomoc! –

9

Histogramy logarytmiczne są łatwiejsze z ggplot niż z podstawową grafiką. Spróbuj czegoś podobnego

library(ggplot2) 
dfr <- data.frame(x = rlnorm(100, sdlog = 3)) 
ggplot(dfr, aes(x)) + geom_histogram() + scale_x_log10() 

Jeśli jesteś zdesperowany dla grafiki bazowych, trzeba wykreślić histogram log skalę bez osi, a następnie ręcznie dodać osie później.

h <- hist(log10(dfr$x), axes = FALSE) 
Axis(side = 2) 
Axis(at = h$breaks, labels = 10^h$breaks, side = 1) 

Dla kompletności, rozwiązanie krata byłaby

library(lattice) 
histogram(~x, dfr, scales = list(x = list(log = TRUE))) 

wyjaśnienie, dlaczego wartości log są potrzebne w przypadku bazowego:

Jeśli wykreślić dane bez logowania -transformacja, wtedy większość danych jest zlepiona w słupki po lewej stronie.

hist(dfr$x) 

Funkcja hist ignoruje log argumentu (ponieważ zakłóca obliczania przerwami), więc to nie działa.

hist(dfr$x, log = "y") 

Nie robi tego.

par(xlog = TRUE) 
hist(dfr$x) 

Oznacza to, że musimy zalogować się, aby przekształcić dane przed narysowaniem wykresu.

hist(log10(dfr$x)) 

Niestety, to rozbija topory, co prowadzi nas do obejścia powyżej.

+0

Jak wspomina Joris, w podstawowym ustawieniu case 'xaxt =" n "' jest czystsze niż 'axes = FALSE', ponieważ nie musisz ręcznie tworzyć oś y. –

+0

Nie rozumiem podstawowego przykładu grafiki - czy bierzesz dziennik z wartościami ('log10 (dfr $ x)')? Dlaczego? –

+0

również, zobacz aktualizację dotyczącą dobrego rozwiązania ggplot2 (+1) –

1

Dynamiczny wykres będzie również pomóc w tej działki. Użyj pakietu manipulate z Rstudio zrobić dynamiczny wahała histogram:

library(manipulate) 
data_distribution <- table(data) 
manipulate(barplot(data_dist[x:y]), x = slider(1,length(data_dist)), y = slider(10, length(data_dist))) 

Następnie będzie można użyć suwaków, aby zobaczyć konkretny rozkład w dynamicznie wybranego zakresu takiego: enter image description here

Powiązane problemy