2017-12-21 7 views
4

내 목표는문제는 내가 R.에서 ggplot2를 사용하여 로그 스케일로 그룹화 된 막대 그래프를 만들려고

enter image description here

R.에서 다음 플롯을 다시했다

생성 한 프로그램이 고해상도 그래프를 만들 수 없기 때문에. 숫자의 범위는 1에서 1000 이상까지이며 그 사이의 모든 곳에서 로그 스케일이 필요합니다.

이 코드는 사용하고있는 코드뿐만 아니라 단순화 된 버전의 데이터 프레임 스 니펫입니다. ggplot2를 사용하여 줄거리를 만들 수 있었지만, 제 문제는 데이터에 1을 많이 가지고있어서 0으로 플롯되고 -1은 0으로 표시된다는 것입니다. 내 R 음모가 어떻게 생겼는지.

enter image description here

genus_counts <- read.table(text = "Genus variable value 
1 Lepisosteus JBGC462  0 
2  Lepomis JBGC462  6 
3 Micropterus JBGC462  2 
4  Perca JBGC462  2 
5 Ictalurus JBGC462  1 
6 Lepisosteus JBGC13 13 
7  Lepomis JBGC13  0 
8 Micropterus JBGC13  0 
9  Perca JBGC13  0 
10 Ictalurus JBGC13  0", header = TRUE) 


ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+ 
     geom_bar(stat="identity", position="dodge")+ 
     scale_y_log10() 

가 수학적으로, 나는이 경우 이유를 이해 (또한 막대 그래프에서 해당 로그 스케일은 정말 이상하지 않습니다). 그러나 내가 흉내 내려고하는 음모에 더 가까운 일치를 얻기 위해 음모 (또는 음모에 넣는 수)를 조정할 수있는 또 다른 방법이 있습니까?

+0

'scale_y_sqrt()'유사한 질문 – Mako212

+1

많은, 예를 들어, [이 사람] (https://stackoverflow.com/questions/41047939/ggplot-barplot-how-to-display-small- 양수 - 로그 스케일 된 y 축). 또한, 최고의 충고는 항상 ** 막대 차트와 로그 축을 혼합하지 마십시오 **. 0 또는 -'s로 불가능합니다. 모든 값이 + ve 일지라도, 막대는 오해의 소지가 있습니다. (1) 막대를 따라 거리를 직선으로 인식합니다. (2) 막대의 상대적 크기는 막대의 하단에 대한 값의 선택에 따라 임의로 결정됩니다. 따라서 마음대로 차이를 억제하거나 과장 할 수 있습니다. 당신이 다른 사람들의 예를 찾을 수 있기 때문에, 그것을 좋아하지는 않습니다. – dww

+0

... 대안으로는 (1) 모든 값이 양수인 경우 점선 차트, (2) 그룹을 별도로 표시하는 무료 (선형) y 축척으로 패싯하거나 (3) 주문 수가 많지 않은 경우와 같이 (3) 범위를 확장하려면 선형 축을 사용하십시오. – dww

답변

3

scale_y_sqrt()을 대신 사용하면이 예가 좋을 것입니다. 이는 예제 플롯과 잘 어울립니다. 1과 2 같은 작은 값과 큰 값을 함께 볼 수 있음을 보여주기 위해 1000이라는 값이있는 행을 추가했습니다.어쩌면

enter image description here

+0

그러나이 솔루션은 또한 로그 스케일이있는 그림처럼 [비례 잉크 원리] (http://callingbullshit.org/tools/tools_proportional_ink.html)에도 위배된다는 점에 유의하십시오. –

3

발생하는 문제는 근본적으로 양수가있는 막대 또는 0 개가있는 막대가 무한대로 길다는 사실과 관련이 있습니다. 바 꽤 먼 길을 부정적으로 이동,이 경우

genus_counts <- read.table(text = "Genus variable value 
1 Lepisosteus JBGC462  0 
2  Lepomis JBGC462  6 
3 Micropterus JBGC462  2 
4  Perca JBGC462  2 
5 Ictalurus JBGC462  1 
6 Lepisosteus JBGC13 13 
7  Lepomis JBGC13  0 
8 Micropterus JBGC13  0 
9  Perca JBGC13  0 
10 Ictalurus JBGC13  0", header = TRUE) 


ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+ 
    geom_bar(stat="identity", position="dodge")+ 
    scale_y_log10(limits = c(0.1, 15)) 

enter image description here

:

에서는 y 축의 축 범위를 변경할 때 무슨 일이 일어 나는지 확인하십시오. 기준점이 1이면

ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+ 
    geom_bar(stat="identity", position="dodge")+ 
    scale_y_log10(limits = c(1e-100, 15)) 

enter image description here

로그 규모의 막대 그래프는 의미가 있습니다, 당신은 1 관련된 값의 변화를 볼 수 있도록 :하지만 우리는 훨씬 더 갈 수 기다립니다 숫자가 < 1은 바가 아래로 내려가는 것으로 표시됩니다. ggplot2가 올바르게 처리합니다. 원점을 0으로 만들려고하면 모든 막대가 무한히 길어지며 적절한 축 범위를 선택할 수 없습니다.

예제로 표시 한 그래프는 y 축에서 1의 위치에 0이 놓여 있다는 점에서 잘못되었습니다. 값 0은 해당 플롯에서 보이지 않으며 모든 막대의 길이는 오도 된 것입니다.

마지막으로 누군가가 제곱근 척도를 언급했습니다. 바 길이가 혼란 때문에 나는, 하나이 솔루션의 큰 팬이 아니에요

ggplot(genus_counts, aes(x=Genus, y=value, fill=variable))+ 
    geom_bar(stat="identity", position="dodge")+ 
    scale_y_sqrt(limits = c(0, 15), breaks = (0:4)^2) 

enter image description here

: 그것은 무한히 긴 바의 문제를 피할 수 있습니다. 값 6에 해당하는 막대가 값 1에 해당하는 막대의 약 2.5 배에 불과하다는 것에 주목하십시오. 우리 뇌는 막대의 상대적 길이에 대해 막대와 래치를 잘못 해석합니다. 중심선.