具有对数标度和自定义中断的直方图

时间:2009-08-07 15:02:34

标签: r histogram logarithm

我正在尝试在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 个答案:

答案 0 :(得分:56)

直方图是穷人的密度估计值。请注意,在使用默认参数调用hist()时,如果需要概率,则频率不是概率 - 请在调用中添加,prob=TRUE

至于日志轴问题,如果你不想转换x轴,请不要使用'x':

plot(mydata_hist$count, log="y", type='h', lwd=10, lend=2)

让你在对数范围内获得标准 - 外观仍然有点不同,但可能会被调整。

最后,您还可以hist(log(x), ...)获取数据日志的直方图。

答案 1 :(得分:45)

另一种选择是使用包ggplot2

ggplot(mydata, aes(x = V3)) + geom_histogram() + scale_x_log10()

答案 2 :(得分:10)

从您的问题来看,您是否想要记录的x轴或记录的y轴并不完全清楚。使用条形时记录的y轴不是一个好主意,因为它们锚定在零,记录时变为负无穷大。您可以使用频率多边形或密度图来解决此问题。

答案 3 :(得分:10)

Dirk的答案很棒。如果你想要像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)

最后一行是可选的,它会在每个栏的顶部添加值标签。这对于对数刻度图非常有用,但也可以省略。

我还会传递mainxlabylab参数,以提供图表标题,x轴标签和y轴标签。

答案 4 :(得分:6)

运行hist()函数而不创建图形,对计数进行对数转换,然后绘制图形。

hist.data = hist(my.data, plot=F)
hist.data$counts = log(hist.data$counts, 2)
plot(hist.data)

它应该看起来像常规直方图,但y轴将是log2频率。

答案 5 :(得分:3)

我在默认情况下放置了一个与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一起工作。但是,这应该可以通过更多的努力来解决。

答案 6 :(得分:3)

这是一个非常好的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