簡體   English   中英

具有對數刻度和自定義間隔的直方圖

[英]Histogram with Logarithmic Scale and custom breaks

我正在嘗試生成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)

最后一行是可選的,它在每個欄的頂部下方添加值標簽。 這對對數刻度圖很有用,但也可以省略。

我還傳遞mainxlabylab參數來提供繪圖標題,x軸標簽和y軸標簽。

在不創建圖形的情況下運行hist()函數,對數進行對數轉換,然后繪制圖形。

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

它的外觀應類似於常規直方圖,但y軸將為log2 Frequency。

這是一個漂亮的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一起使用

我整理了一個函數,它在默認情況下的行為與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兼容。 盡管如此,應該可以更輕松地解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM