2009-08-07 89 views
64

我試圖用R的對數刻度生成直方圖。目前我做的:對數刻度和自定義中斷的直方圖

hist(mydata$V3, breaks=c(0,1,2,3,4,5,25)) 

這給了我一個直方圖,但1 0之間的密度是如此之大(約一百萬值差),你可以幾乎看不清任何其他酒吧。

然後我試着做:

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,它也將數據顯示爲點而非條形圖。 barplot的作品,但我沒有得到任何底線。

+0

相關舊的問題:[請在直方圖y軸的對數使用R](https://stackoverflow.com/questions/7828248/make-y-axis-logarithmic-in-histogram-using-r) – smci 2017-05-30 05:27:52

回答

52

直方圖是一個窮人的密度估計。請注意,在您使用默認參數呼叫hist()時,您將得到頻率不是概率 - 如果您需要概率,請將,prob=TRUE添加到呼叫中。

至於日誌軸的問題,不要用「X」如果你不想x軸轉化的更多信息:

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

讓你的酒吧在數Y比例 - 在look-感覺仍然有點不同,但可能會調整。

最後,您還可以執行hist(log(x), ...)以獲取數據日誌的柱狀圖。

+0

非常好!我怎樣才能修改底部的軸?我不想顯示1,2,3,4,5,6,我想顯示0 <= 1,1 <= 2等。 – Weegee 2009-08-07 16:14:11

+3

抑制plot()中的座標軸並顯式調用axis(),給出'where'和'what'可以讓你做到這一點。 – 2009-08-07 16:21:16

33

另一種選擇是使用包裝ggplot2

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

是否希望記錄x軸或登錄y軸這不完全是從你的問題不清楚。使用條形圖時,記錄的y軸不是一個好主意,因爲它們固定在零點,記錄時變爲負無窮大。您可以通過使用頻率多邊形或密度圖來解決此問題。

9

德克的回答是一個很好的答案。如果你想喜歡什麼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,xlabylab參數來提供繪圖標題,x軸標籤和y軸標籤。

2

我已經放在一起在默認情況下行爲與hist行爲相同的函數,但接受日誌參數。它使用了其他海報的幾個技巧,但增加了一些自己的技巧。​​和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因爲它的立場。儘管如此,這應該是可以解決的。

4

運行hist()函數而不創建圖形,對計數進行對數轉換,然後繪製圖形。

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

它應該看起來就像常規直方圖,但y軸將是log2頻率。

+0

爲了防止-Inf你必須使用以下內容: 'hist.data $ counts [hist.data $ counts> 0] < - log(hist.data $ counts [hist.data $ counts> 0], 2)' – kory 2017-03-22 16:40:43

1

這是一個相當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工作