Гистограмма с логарифмической шкалой и пользовательскими разрывами
Я пытаюсь создать гистограмму в 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 работает, но тогда я не получу никакой нижней оси.
7 ответов:
гистограмма-это оценка плотности бедняка. Обратите внимание, что в вызове
hist()использование аргументов по умолчанию, вы получаете частот не вероятности -- добавить,prob=TRUEк вызову, если вы хотите вероятности.что касается проблемы оси журнала, не используйте "x", если вы не хотите, чтобы ось x была преобразована:
plot(mydata_hist$count, log="y", type='h', lwd=10, lend=2)получает вам бары на шкале журнала-y - внешний вид все еще немного отличается, но, вероятно, может быть изменен.
наконец, вы можно также сделать
hist(log(x), ...)чтобы получить гистограмму журнала ваших данных.
другой вариант - использовать пакет
ggplot2.ggplot(mydata, aes(x = V3)) + geom_histogram() + scale_x_log10()
Дирк представляет собой один большой. Если вы хотите внешний вид, как то, что
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.
из вашего вопроса не совсем ясно, хотите ли вы регистрировать ось x или регистрируемую ось y. Регистрируемая ось 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
Comments