로그 스케일 및 사용자 지정 나누기가있는 히스토그램
저는 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
, 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 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
'Development Tip' 카테고리의 다른 글
프로그램이 시작될 때 관리자 권한을 요청하는 방법은 무엇입니까? (0) | 2020.10.26 |
---|---|
SQL Server IIF와 CASE (0) | 2020.10.26 |
파이썬을 사용하여 파일에서 한 번에 두 줄을 읽는 방법 (0) | 2020.10.26 |
일부 패턴을 제외하고 grep하는 방법? (0) | 2020.10.26 |
임시 변수가 내 프로그램을 느리게합니까? (0) | 2020.10.26 |