Гистограмма с логарифмической шкалой и настраиваемыми разрывами
Вопрос
Я пытаюсь создать гистограмму в 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
работает, но тогда я не получаю никакой нижней оси.
Решение
Гистограмма — это оценка плотности бедняков.Обратите внимание, что при вызове hist()
используя аргументы по умолчанию, вы получаете частоты не вероятности - добавьте ,prob=TRUE
к звонку, если вам нужны вероятности.
Что касается проблемы с осью журнала, не используйте «x», если вы не хотите, чтобы ось X преобразовывалась:
plot(mydata_hist$count, log="y", type='h', lwd=10, lend=2)
дает вам столбцы в логарифмическом масштабе - внешний вид все еще немного отличается, но, вероятно, его можно настроить.
Наконец, вы также можете сделать hist(log(x), ...)
чтобы получить гистограмму журнала ваших данных.
Другие советы
Другой вариант — использовать пакет ggplot2
.
ggplot(mydata, aes(x = V3)) + geom_histogram() + scale_x_log10()
Из вашего вопроса не совсем ясно, хотите ли вы регистрировать ось X или регистрировать ось Y.Зарегистрированная ось Y не является хорошей идеей при использовании столбцов, поскольку они привязаны к нулю, который при регистрации становится отрицательной бесконечностью.Эту проблему можно обойти, используя полигон частот или график плотности.
Ответ Дирка великолепен.Если вы хотите такой внешний вид 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.
Запустите функцию hist(), не создавая график, выполните лог-преобразование счетчиков, а затем нарисуйте фигуру.
hist.data = hist(my.data, plot=F)
hist.data$counts = log(hist.data$counts, 2)
plot(hist.data)
Она должна выглядеть так же, как обычная гистограмма, но ось Y будет иметь частоту log2.
Я собрал функцию, которая в случае по умолчанию ведет себя идентично функции hist, но принимает аргумент log.Он использует несколько приемов других плакатов, но добавляет и несколько своих. 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)
}
Упражнение для читателя:К сожалению, не все, что работает с hist, работает и с myhist в его нынешнем виде.Однако это можно исправить, приложив немного больше усилий.
Вот красивое решение 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.