2016-10-03 4 views
0

이 기사에서 설명한대로 클래스에서 정렬 된 데이터가 있습니다. https://www.r-bloggers.com/from-continuous-to-categorical/ 이렇게하면 어떤 값이 더 일반적인 지 쉽게 알 수 있습니다. 이러한 클래스를 생성 한 후 나는 다음과 같은 전형적인 코드와는 다른 종류의 주파수를 가진 막대 그래프를 만들려면 :geom_vline 카테고리 데이터가있는 x 축의 세로선 : ggplot2

set.seed(1) 
df.v <- data.frame(val = rnorm(1000, mean(4, sd=2))) 
df.v$val.clss <- cut(df.v$val, seq(min(df.v$val), max(df.v$val), 1)) 
p1 <- ggplot(data = df.v)+ 
    geom_bar(aes(val.clss)) 
plot(p1) 

내가 알아낼 수 없습니다 사이에 정확히 수직 라인을 추가하는 방법입니다 4 주위에 두 개의 막대가 있으므로 x 축 값에 완벽하게 맞 춥니 다. 이 기사를 발견했지만 도움이되지 않았습니다. How to get a vertical geom_vline to an x-axis of class date? 도움이 되었습니까? 어쩌면 나는 데이터에 대한 솔루션을 적용하기에는 너무 새롭다. 프레임. 그렇다면 질문을 용서해주십시오.

답변

3

, 그 전달 :

myLoc <- 
    (which(levels(df.v$val.clss) == "(2.99,3.99]") + 
    which(levels(df.v$val.clss) == "(3.99,4.99]"))/
    2 


p1 + 
    geom_vline(aes(xintercept = myLoc)) 

그룹을 건너 뛰는 경우 요인의 모든 수준이 플롯되어 있는지 확인해야합니다. 연속 된 데이터를 binned했을 때 중간 레벨을 떨어 뜨리지 않는 것이 가장 좋습니다.

p1 + 
    geom_vline(aes(xintercept = myLoc)) + 
    scale_x_discrete(drop = FALSE) 

다른 방법으로는 (이전의 음모와 myLoc 계산에) 모두 함께 데이터에서 누락 된 수준을 드롭 수 :

df.v <- droplevels(df.v) 

그런 다음 그것을 그릴 수 것이라고 만 포함됩니다.

마지막 옵션으로, 자동으로 비닝을 수행하는 geom_histogram을 사용할 수 있지만 데이터를 원래 크기대로 남겨두면 줄을 쉽게 추가 할 수 있습니다.

ggplot(df.v 
     , aes(val)) + 
    geom_histogram(binwidth = 1) + 
    geom_vline(xintercept = 4) 
+0

의 vline에 대한 업데이트 된 코드를 참조하십시오.이 기능은 이론상으로 작동합니다. 그러나 위 예제 코드를 'cut (df.v $ val, seq (min (df.v $ val), max (df.v $ val), 0.2))' 으로 변경하면 34 개의 클래스 16.5를 xintercept로 선택하면 오른쪽으로 너무 멀리 떨어져 있습니다. 나는 왜, 어쩌면 도울 수 있겠는가? 정말 고맙습니다. 글쎄, 나는 'length (levels (df.v $ val.clss))'를 사용할 때 34라는 것을 알았지 만, 내가 막대를 세면 30 막대 만 얻는다. 이것은 내 문제의 근원 인 것 같다. – rashid

+1

값이없는 범주로 인해 발생했을 가능성이 큽니다. 'ggplot'은 기본적으로 그 값을 떨어 뜨립니다. 이것은 플롯의 레벨에 영향을 미칩니다. 일부 선택적 솔루션에 대해서는 편집을 참조하십시오. 그러나,'물방울'은 보통 연속 데이터에 대한 좋은 생각이 아니기 때문에주의해서 사용해야합니다. –

+0

감사합니다. 'scale_x_discrete (drop = FALSE)'가 자동 계산의 트릭입니다. 도움에 정말 감사드립니다. – rashid

2

원하십니까?

p1 <- ggplot(data = df.v)+ 
    geom_bar(aes(val.clss)) + geom_vline(xintercept = 3.5, col='red', lwd=2) 
plot(p1) 

enter image description here

더 일반적인 해결책이 될 수있다 :

df.v <- data.frame(val = rnorm(1000, mean=15, sd=4)) 
df.v$val.clss <- cut(df.v$val, seq(min(df.v$val), max(df.v$val), 1)) 

lvls <- levels(df.v$val.clss) 
lvls 
[1] "(2.97,3.97]" "(3.97,4.97]" "(4.97,5.97]" "(5.97,6.97]" "(6.97,7.97]" "(7.97,8.97]" "(8.97,9.97]" "(9.97,11]" "(11,12]"  "(12,13]"  
[11] "(13,14]"  "(14,15]"  "(15,16]"  "(16,17]"  "(17,18]"  "(18,19]"  "(19,20]"  "(20,21]"  "(21,22]"  "(22,23]"  
[21] "(23,24]"  "(24,25]"  "(25,26]"  "(26,27]"  "(27,28]"  "(28,29]"  "(29,30]"  

vline.level <- '(18,19]' # you want to draw line here, right before 18 

p1 <- ggplot(data = df.v)+ 
+ geom_bar(aes(val.clss)) + geom_vline(xintercept = which(lvls == vline.level) - 0.5, col='red', lwd=2) + 
+ theme(axis.text.x = element_text(angle=90, vjust = 0.5)) 
plot(p1) 

enter image description here

당신이 제일 한가운데의 수준을 선택하려면,

length(lvls) 
#[1] 27 
# choose the middlemost level, since length(lvls) is odd in this case, the midpoint will be ceiling(length(lvls)/2) 
vline.level <- lvls[ceiling(length(lvls)/2)] 

p1 <- ggplot(data = df.v)+ 
    geom_bar(aes(val.clss)) + geom_vline(xintercept = which(lvls == vline.level) - 0.5, col='red', lwd=2) + 
    theme(axis.text.x = element_text(angle=90, vjust = 0.5)) 
plot(p1) 
당신이 줄을 당신은 숫자에 (그들이에 매핑되는 요인을) 자신의 위치를 ​​변환 할 수 있습니다 사이에 가고 싶은 두 막대의 레이블을 알고 있다면3210

enter image description here

+0

정확히. 하지만 내가 다른 범주의 범주를 가지고 있다면 xintercept의 가치를 결정하는 방법은 무엇입니까? 예제에서와 같이 6 개의 카테고리가 있고 그 다음에 10 개의 카테고리가 있다고 가정 해 봅시다. xintercept 값을 어떻게 계산합니까? 나는 94 가지 범주의 사례를 가지고 있으며, 작동을 발견 한 xintercept는 43.5이며, 이것은 절반이 아닙니다. – rashid

+0

가 더 일반적인 솔루션으로 업데이트되었습니다. @rashid –

+0

고마워요. 그러나 그 라인은 여전히 ​​더 오른쪽에 있습니다. 그것의 왼쪽에 15 바, 오른쪽에 10 바. 나는 그것을 중간에 생각하고 싶습니다. 어떤 생각입니까? – rashid