Development Tip

로그 스케일 및 사용자 지정 나누기가있는 히스토그램

yourdevel 2020. 10. 26. 21:25
반응형

로그 스케일 및 사용자 지정 나누기가있는 히스토그램


저는 y에 대한 로그 스케일을 사용하여 R에서 히스토그램을 생성하려고합니다. 현재 나는 :

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")

내가 원하는 것을 정렬 할 수 있지만 하단에는 0, 1, 2, 3, 4, 5, 25가 아닌 1-6 값이 표시됩니다. 또한 데이터를 막대가 아닌 점으로 표시합니다. barplot작동하지만 하단 축이 없습니다.


히스토그램은 가난한 사람의 밀도 추정치입니다. hist()기본 인수 사용 에 대한 호출에서 확률이 아닌 빈도 를 얻습니다 ,prob=TRUE. 확률을 원하면 호출에 추가하십시오 .

로그 축 문제의 경우 x 축을 변환하지 않으려면 'x'를 사용하지 마십시오.

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

당신에게 log-y 척도로 막대를 가져옵니다-모양과 느낌은 여전히 ​​약간 다르지만 아마도 조정할 수 있습니다.

마지막으로 hist(log(x), ...)데이터 로그의 히스토그램을 얻을 수도 있습니다 .


또 다른 옵션은 패키지를 사용하는 것 ggplot2입니다.

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

기록 된 x 축 또는 기록 된 y 축을 원하는지 질문에서 완전히 명확하지 않습니다. 기록 된 y 축은 막대가 0에 고정되어 기록 될 때 음의 무한대가되기 때문에 막대를 사용할 때 좋은 생각이 아닙니다. 주파수 다각형 또는 밀도 플롯을 사용하여이 문제를 해결할 수 있습니다.


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)

마지막 줄은 선택 사항이며 각 막대의 상단 바로 아래에 값 레이블을 추가합니다. 이는 로그 스케일 그래프에 유용 할 수 있지만 생략 할 수도 있습니다.

또한 전달 main, xlabylab파라미터 플롯 제목, X 축 레이블 및 Y 축 라벨을 제공한다.


그래프를 만들지 않고 hist () 함수를 실행하고 카운트를 로그 변환 한 다음 그림을 그립니다.

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

일반 히스토그램처럼 보이지만 y 축은 log2 Frequency가됩니다.


기본 경우에는 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)
}

Exercise for the reader: Unfortunately, not everything that works with hist works with myhist as it stands. That should be fixable with a bit more effort, though.


Here's a pretty ggplot2 solution:

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))
  )

Note that to set the breaks in geom_histogram, they had to be transformed to work with scale_x_log10

참고URL : https://stackoverflow.com/questions/1245273/histogram-with-logarithmic-scale-and-custom-breaks

반응형