Гистограмма с логарифмической шкалой и пользовательскими перерывами
Я пытаюсь создать гистограмму в R с логарифмической шкалой для y. В настоящее время я делаю:
hist(mydata$V3, breaks=c(0,1,2,3,4,5,25))
Это дает мне гистограмму, но плотность от 0 до 1 настолько велика (около миллиона разностей значений), что вы едва можете различить любой из других баров.
Затем я попытался сделать:
mydata_hist <- hist(mydata$V3, breaks=c(0,1,2,3,4,5,25), plot=FALSE)
plot(rpd_hist$counts, log="xy", pch=20, col="blue")
Это дает мне то, что я хочу, но внизу показывает мне значения 1-6, а не 0, 1, 2, 3, 4, 5, 25. Он также показывает данные как точки, а не бары. barplot
работает, но тогда я не получаю ни одной нижней оси.
Ответы
Ответ 1
Гистограмма - это оценка плотности бедного человека. Обратите внимание, что при вызове hist()
с использованием аргументов по умолчанию вы получаете частоты не вероятности - добавьте ,prob=TRUE
к вызову, если хотите вероятности.
Что касается проблемы с осью журнала, не используйте 'x', если вы не хотите преобразовать ось x:
plot(mydata_hist$count, log="y", type='h', lwd=10, lend=2)
получает бары по шкале логарифмов - внешний вид все еще немного отличается, но, вероятно, может быть изменен.
Наконец, вы также можете сделать hist(log(x), ...)
, чтобы получить гистограмму журнала ваших данных.
Ответ 2
Другой вариант - использовать пакет ggplot2
.
ggplot(mydata, aes(x = V3)) + geom_histogram() + scale_x_log10()
Ответ 3
Ответ Дирка - отличный. Если вы хотите выглядеть так, как это делает hist
, вы также можете попробовать следующее:
buckets <- c(0,1,2,3,4,5,25)
mydata_hist <- hist(mydata$V3, breaks=buckets, plot=FALSE)
bp <- barplot(mydata_hist$count, log="y", col="white", names.arg=buckets)
text(bp, mydata_hist$counts, labels=mydata_hist$counts, pos=1)
Последняя строка необязательна, она добавляет метки значений только под верхнюю часть каждой панели. Это может быть полезно для графиков шкалы логов, но также может быть опущено.
Я также передаю параметры main
, xlab
и ylab
, чтобы предоставить заголовок сюжета, метку оси x и метку оси y.
Ответ 4
Из вашего вопроса неясно, хотите ли вы зарегистрированную ось x или зарегистрированную ось y. Записанная ось y не является хорошей идеей при использовании баров, потому что они привязаны к нулю, что становится отрицательной бесконечностью при регистрации. Вы можете обойти эту проблему, используя частотный полигон или график плотности.
Ответ 5
Запустите функцию hist(), не создавая график, лог-преобразование счетчиков, а затем рисуем фигуру.
hist.data = hist(my.data, plot=F)
hist.data$counts = log(hist.data$counts, 2)
plot(hist.data)
Он должен выглядеть так же, как и обычная гистограмма, но ось y будет иметь частоту log2.
Ответ 6
Я собрал функцию, которая ведет себя одинаково с историей в случае по умолчанию, но принимает аргумент журнала. Он использует несколько трюков с других плакатов, но добавляет несколько своих собственных. hist(x)
и myhist(x)
выглядят одинаково.
Оригинальная проблема будет решена с помощью:
myhist(mydata$V3, breaks=c(0,1,2,3,4,5,25), log="xy")
Функция:
myhist <- function(x, ..., breaks="Sturges",
main = paste("Histogram of", xname),
xlab = xname,
ylab = "Frequency") {
xname = paste(deparse(substitute(x), 500), collapse="\n")
h = hist(x, breaks=breaks, plot=FALSE)
plot(h$breaks, c(NA,h$counts), type='S', main=main,
xlab=xlab, ylab=ylab, axes=FALSE, ...)
axis(1)
axis(2)
lines(h$breaks, c(h$counts,NA), type='s')
lines(h$breaks, c(NA,h$counts), type='h')
lines(h$breaks, c(h$counts,NA), type='h')
lines(h$breaks, rep(0,length(h$breaks)), type='S')
invisible(h)
}
Упражнение для читателя: к сожалению, не все, что работает с историей, работает с моим мифистом. Это должно быть исправлено с меньшими усилиями.
Ответ 7
Здесь довольно ggplot2 решение:
library(ggplot2)
library(scales) # makes pretty labels on the x-axis
breaks=c(0,1,2,3,4,5,25)
ggplot(mydata,aes(x = V3)) +
geom_histogram(breaks = log10(breaks)) +
scale_x_log10(
breaks = breaks,
labels = scales::trans_format("log10", scales::math_format(10^.x))
)
Обратите внимание, что для установки разрывов в geom_histogram они должны были быть преобразованы для работы с scale_x_log10