Как я могу построить гистограмму длиннохвостых данных, используя R? - PullRequest
16 голосов
/ 05 октября 2010

У меня есть данные, которые в основном сосредоточены в небольшом диапазоне (1-10), но есть значительное количество точек (скажем, 10%), которые находятся в (10-1000).Я хотел бы построить гистограмму для этих данных, которая будет сосредоточена на (1-10), но также покажет данные (10-1000).Что-то вроде логарифмической шкалы для гистограммы.

Да, я знаю, это означает, что не все ячейки имеют одинаковый размер

Простой hist(x) дает alt text, тогда как 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))) дает alt text

ничего из того, что я хочу.

обновление , следуя приведенным здесь ответам, я теперь создаю что-то, почти то, что я хочу (я пошел с непрерывнымГрафик вместо гистограммы):

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 Единственная проблема заключается в том, что я хотел бы сопоставить масштаб и фактические бары, нанесенные на график.Для этого есть два варианта: один - просто использовать фактические поля графиков (как?), Затем получить «некрасивые» метки оси X, как 1.1754, 12985 и т. Д. Другой, который я предпочитаю, - это контролировать фактическийполя полей используются так, чтобы они соответствовали перерывам.

Ответы [ 3 ]

9 голосов
/ 05 октября 2010

Гистограммы логарифмического масштаба проще с ggplot, чем с базовой графикой. Попробуйте что-то вроде

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

Если вы отчаянно нуждаетесь в базовой графике, вам необходимо построить гистограмму логарифмического масштаба без осей, а затем вручную добавить оси.

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

Для полноты, решение решетки будет

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

ОБЪЯСНЕНИЕ, ПОЧЕМУ ЗНАЧЕНИЯ ЖУРНАЛА НЕОБХОДИМЫ В СЛУЧАЕ ОСНОВАНИЯ:

Если вы вычерчиваете данные без преобразования журнала, большая часть данных сгруппирована в столбцы слева.

hist(dfr$x)

Функция hist игнорирует аргумент log (потому что он мешает вычислению разрывов), поэтому это не работает.

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

Ни то, ни другое.

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

Это означает, что нам нужно зарегистрировать данные преобразования, прежде чем мы начнем рисовать график.

    hist(log10(dfr$x))

К сожалению, это портит оси, что приводит нас к обходному пути выше.

7 голосов
/ 05 октября 2010

Использование ggplot2 кажется наиболее простым вариантом.Если вы хотите больше контролировать свои оси и разрывы, вы можете сделать что-то вроде следующего:

РЕДАКТИРОВАТЬ: новый код предоставляется

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)

Это как можно ближеggplot2.Поместить серый фон не так-то просто, но выполнимо, если вы определите прямоугольник с размером экрана графика и установите серый фон.

Проверьте все используемые мной функции, а также ?par.Это позволит вам строить свои собственные графики.Надеюсь, это поможет.

alt text

1 голос
/ 21 сентября 2014

Динамический график также поможет в этом графике. Используйте пакет манипулировать из Rstudio для создания гистограммы с динамическим диапазоном:

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

Тогда вы сможете использовать ползунки, чтобы увидеть конкретное распределение в динамически выбранном диапазоне, например: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...