Гистограмма с логарифмической шкалой и настраиваемыми разрывами

StackOverflow https://stackoverflow.com/questions/1245273

  •  12-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать гистограмму в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top