嗨,我正在使用 R 制作直方图,但是 Y 轴的数量太大,我需要将其转换为对数。请参阅下面的脚本:
hplot<-read.table("libl")
hplot
pdf("first_end")
hist(hplot$V1, breaks=24, xlim=c(0,250000000), ylim=c(0,2000000),main="first end mapping", xlab="Coordinates")
dev.off()
那么我应该如何更改我的脚本呢?谢谢
您可以保存直方图数据以在绘图之前对其进行调整:
set.seed(12345)
x = rnorm(1000)
hist.data = hist(x, plot=F)
hist.data$counts = log10(hist.data$counts)
dev.new(width=4, height=4)
hist(x)
dev.new(width=4, height=4)
plot(hist.data, ylab='log10(Frequency)')
另一种选择是使用plot(density(hplot$V1), log="y")
.
它不是直方图,但它显示的信息几乎相同,并且它避免了不合逻辑的部分,即计数为零的 bin 在日志空间中没有明确定义。
当然,这仅在您的数据是连续的而不是真正分类或有序的数据时才有意义。
y 轴在对数刻度上的直方图将是一个相当奇怪的直方图。从技术上讲,它仍然符合定义,但它可能看起来相当误导:峰值将相对于分布的其余部分变平。
您是否考虑过,而不是使用对数转换:
将计数除以 100 万:
h <- hist(hplot$V1, plot=FALSE)
h$counts <- h$counts/1e6
plot(h)
将直方图绘制为密度估计:
hist(hplot$V1, freq=FALSE)
您可以记录绘图的 y 值,然后添加自定义日志 y 轴。
这是随机正态分布数的表对象的示例:
# data
count = table(round(rnorm(10000)*2))
# plot
plot(log(count) ,type="h", yaxt="n", xlab="position", ylab="log(count)")
# axis labels
yAxis = c(0,1,10,100,1000)
# draw axis labels
axis(2, at=log(yAxis),labels=yAxis, las=2)