具有对数比例和自定义中断的直方图
我试图在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()
,如果您需要概率,您将获得频率而不是概率 – 将add ,prob=TRUE
。
至于日志轴的问题,如果你不想改变x轴,不要使用'x':
plot(mydata_hist$count, log="y", type='h', lwd=10, lend=2)
在日志规模上得到了你的禁忌 – 外观还是有点不同,但可能会调整。
最后,你也可以做hist(log(x), ...)
来得到数据日志的直方图。
另一种select是使用包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轴标签。
从你的问题来看,你是不是想要一个logging的x轴或一个logging的y轴。 logging的Y轴在使用条形图时不是一个好主意,因为它们被固定在零处,当logging时变成负无穷大。 您可以通过使用频率多边形或密度图来解决此问题。
运行hist()函数而不绘制graphics,对计数进行对数转换,然后绘制graphics。
hist.data = hist(my.data, plot=F) hist.data$counts = log(hist.data$counts, 2) plot(hist.data)
它应该看起来就像常规直方图,但Y轴将是log2频率。
我已经放在一起,在默认情况下,行为与hist的行为相同,但接受日志参数。 它使用其他海报的几个技巧,但增加了一些自己的。 hist(x)
和myhist(x)
看起来完全相同。
原来的问题可以通过以下方式解决:
myhist(mydata$V3, breaks=c(0,1,2,3,4,5,25), log="xy")
function:
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解决scheme:
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