문제

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)

로그 규모로 막대를 표시합니다. 모양과 느낌은 여전히 ​​약간 다르지만 조정할 수 있습니다.

마지막으로, 당신도 할 수 있습니다 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, xlab, 그리고 ylab 플롯 제목, X 축 레이블 및 y 축 레이블을 제공하는 매개 변수.

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

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

함수:

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 솔루션은 다음과 같습니다.

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과 함께 작동하도록 변환해야했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top