2012-02-29 8 views
15

ggplot을 사용하여 크기 조정에 흥미로운 문제가 발생했습니다. 기본 선형 눈금을 사용하여 그래프를 잘 그릴 수있는 데이터 집합이 있지만 scale_y_log10()을 사용하면 숫자가 줄어 듭니다. 다음은 몇 가지 예제 코드와 두 장의 그림입니다. 선형 스케일의 최대 값은 ~ 700이며 로그 스케일링의 값은 10^8입니다. 전체 데이터 세트는 길이가 ~ 8000 개의 항목 일 뿐이므로 무언가가 옳지 않다는 것을 보여줍니다.ggplot scale_y_log10() 문제

이 문제는 내 데이터 집합과 비닝의 구조와 관련이 있다고 생각합니다.이 오류는 '다이아몬드'와 같은 일반적인 데이터 집합에 복제 할 수 없습니다. 그러나 나는 최선의 방법으로 문제를 해결할 수 있을지 확신하지 못하고있다.

감사 자크의 CP


편집 :

example_1 = ggplot(diamonds, aes(x=clarity, fill=cut)) + 
    geom_bar() + scale_y_log10(); print(example_1) 

#data.melt is the name of my dataset  
> ggplot(data.melt, aes(name, fill= Library)) + geom_bar() 
> ggplot(data.melt, aes(name, fill= Library)) + geom_bar() + scale_y_log10() 
> length(data.melt$name) 
[1] 8003 

linear scale log scale

: bdamarest이 같은 다이아몬드 데이터 세트의 규모의 문제를 재현 할 수 있습니다

여기 몇 가지 예제 데이터가 있습니다. 문제가 발생했다고 생각합니다. 원래 녹은 데이터 세트는 ~ 10^8 행이었을 수 있습니다. 어쩌면 행 번호가 통계에 사용되고 있습니까?

> head(data.melt) 
     Library   name    group 
221938  AB Arthrofactin  glycopeptide 
235087  AB Putisolvin  cyclic peptide 
235090  AB Putisolvin  cyclic peptide 
222125  AB Arthrofactin  glycopeptide 
311468  AB  Triostin cyclic depsipeptide 
92249  AB   CDA   lipopeptide 


> dput(head(test2)) 
structure(list(Library = c("AB", "AB", "AB", "AB", "AB", "AB" 
), name = c("Arthrofactin", "Putisolvin", "Putisolvin", "Arthrofactin", 
"Triostin", "CDA"), group = c("glycopeptide", "cyclic peptide", 
"cyclic peptide", "glycopeptide", "cyclic depsipeptide", "lipopeptide" 
)), .Names = c("Library", "name", "group"), row.names = c(221938L, 
235087L, 235090L, 222125L, 311468L, 92249L), class = "data.frame") 

UPDATE :

행 번호는 문제가되지 않습니다. 여기서 동일한 데이터를 동일한 AES는 X 축을 이용하여 그래프 색상을 채우고 스케일링 전적으로 정확된다

> ggplot(data.melt, aes(name, fill= name)) + geom_bar() 
> ggplot(data.melt, aes(name, fill= name)) + geom_bar() + scale_y_log10() 
> length(data.melt$name) 
[1] 8003 

enter image description here enter image description here

답변

24

geom_barscale_y_log10 (또는 로그 스케일)가 잘 작동하지 않는다 함께 결과를 기대하지 않습니다.

제 근본적인 문제는 바 0으로 이동 대수 눈금에서 0 (플롯 어렵다) 음의 무한대로 변환된다는 것이다. 로그 스케일이 돈을 아마 필요한 경우 때문에 주변의 침대는 보통 (이후 $ \ 로그 (1) = 0 $), 0 카운트가 있다면 아무것도 플롯되지 및 왜곡에 대해 걱정하지 1이 아닌 0에서 시작합니다 내가 @dbemarest가 보여 그 diamonds 예를 사용하고

'는 t 1으로 해제되는 신경 (반드시 사실이 아니다,하지만 ...).

일반적으로 이것은 그렇지 스케일 (차이에 더 이상), 좌표 변환을 수행한다.

ggplot(diamonds, aes(x=clarity, fill=cut)) + 
    geom_bar() + 
    coord_trans(ytrans="log10") 

하지만 이것은 음의 무한대에서 문제 발생 오류

Error in if (length(from) == 1 || abs(from[1] - from[2]) < 1e-06) return(mean(to)) : 
    missing value where TRUE/FALSE needed 

을 준다.

스케일 변환을 사용하면 변환이 데이터에 적용된 다음 통계와 배열이 만들어진 다음 스케일이 역변환 (대략적으로)으로 표시됩니다. 계산을 직접 해독하여 어떤 일이 일어나는지 확인할 수 있습니다.

ggplot(DF, aes(x=clarity, y=n, fill=cut)) + 
    geom_bar(stat="identity") 

enter image description here

과 y 축이 제공 스케일링 : 우리가 정상적인 방법이 음모 경우

> head(DF) 
    clarity  cut n log10n 
1  I1  Fair 210 2.322219 
2  I1  Good 96 1.982271 
3  I1 Very Good 84 1.924279 
4  I1 Premium 205 2.311754 
5  I1  Ideal 146 2.164353 
6  SI2  Fair 466 2.668386 

, 우리는 예상 막대 그래프를 얻을 수 있습니다

DF <- ddply(diamonds, .(clarity, cut), summarise, n=length(clarity)) 
DF$log10n <- log10(DF$n) 

미리 요약되지 않은 데이터를 사용하는 것과 동일한 문제.

ggplot(DF, aes(x=clarity, y=n, fill=cut)) + 
    geom_bar(stat="identity") + 
    scale_y_log10() 

enter image description here

문제가 카운트의 log10() 값을 플롯에 의해 발생하는 방법을 우리는 볼 수 있습니다

.
ggplot(DF, aes(x=clarity, y=log10n, fill=cut)) + 
    geom_bar(stat="identity") 

enter image description here

이 그냥 scale_y_log10와 하나처럼 보이지만 라벨은 0, 5, 10입니다

... 대신^0 10^5 10^10 (10). ..

따라서 scale_y_log10을 사용하면 로그가 변환되고 해당 로그가 스택되며 반올림 로그 형식으로 표시됩니다. 그러나 스태킹 로그는 선형 변환이 아니므로 요구 사항에 아무런 의미가 없습니다.

하단 눈금은 로그 눈금의 누적 가로 막 대형 차트가 0에서 시작할 수 없기 때문에 의미가 없습니다 (막대의 아래쪽이 있어야 함). 막대의 부분을 비교하는 것이 적당하지 않습니다. 그 크기는 스택에있는 위치에 따라 달라지기 때문입니다. 같은 대신 고려 뭔가 :

ggplot(diamonds, aes(x=clarity, y=..count.., colour=cut)) + 
    geom_point(stat="bin") + 
    scale_y_log10() 

enter image description here

또는 당신이 정말로 당신을 줄 것입니다 일반적으로 바 스태킹 그룹에 대한 총을 원하는 경우, 당신은 같은 것을 수행 할 수 있습니다

ggplot(diamonds, aes(x=clarity, y=..count..)) + 
    geom_point(aes(colour=cut), stat="bin") + 
    geom_point(stat="bin", colour="black") + 
    scale_y_log10() 

enter image description here

+1

브라이언에게 감사드립니다. 자세한 설명을 부탁드립니다. geom_bar (position = "dodge")를 사용할 수도 있습니다 (Winston Chang의 답변 예) – zach

+0

여기에서 일어나는 일에 대해 좀 더 통찰력을주기 위해 누적 막 대형 차트는 대개 개수 합계와 같은 막대 높이를 제공합니다. 그러나 sum (log (counts))은 log (product (counts))와 같습니다. 다시 말해, 카운트를 함께 곱한 것처럼 막대 높이를 볼 수 있습니다. – Brian