로그 눈금 및 사용자 지정 구분선이 포함된 히스토그램
문제
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과 함께 작동하도록 변환해야했습니다.