2016-09-12 2 views
1

저는 메인 사이트와 위성 위치의 차이를 강조하는 일련의 막대 차트 (여러 사이트에 대해 복제 될 예정)를 만들려고합니다. geom_point를 사용하여 다소 가까이에 올 수 있지만, 막대 차트가 가장 낮은 지점에서 시작하고 메인 사이트 및 위성 위치에 대한 레이블과 그 차이점이 막대 차트로 표시되도록하고 싶습니다. 다음은 내가 가지고있는 샘플 코드 및 스크린 샷과 내가 좋아할만한 아이디어입니다.막대의 시작점이 0보다 큰 막대 차트를 R로 만드는 방법은 무엇입니까?

library(ggplot2) 
library(dplyr) 

site <- c("Site A", "Main Site", "Site A", "Main Site", "Site A", "Main Site") 
year <- c("2013", "2013", "2014", "2014","2015", "2015") 
value <- c(57, 74, 60, 50, 60, 68) 

df <- data.frame (site, year, value) 

df %>% 
    mutate (label = paste0(site, " (", value, ")")) %>% 
    ggplot (aes (x = year, y = value, group = site, colour = site)) + 
    geom_point (size = 0.5) + 
    scale_y_continuous(limits = c (0,100)) + 
    geom_text (aes(label = label)) 

enter image description here

enter image description here

+5

Barcharts은 0에서 시작하지만 당신은 당신이 원하는 목적지 직사각형을 그릴'geom_rect'를 사용할 수 있습니다. – Gregor

답변

1

@gregor에서 주석에 위로 따라, 당신은 (dcastreshape2에서하고 dplyr

df %>% 
    dcast(year~site) %>% 
    mutate(midpt = (`Main Site` + `Site A`)/2 
     , dir = factor((`Main Site` - `Site A`) > 0 
         , levels = c(FALSE,TRUE) 
         , labels = c("Negative", "Positive")) 
     , diff = abs(`Main Site` - `Site A`)) %>% 
    ggplot(aes(x = year 
      , y = midpt 
      , fill = dir 
      , height = diff)) + 
    geom_tile() + 
    scale_fill_manual(values = c("Positive" = "darkgreen" 
           , "Negative" = "red3")) 

의 많이 사용주의 아래를 시도 할 수 있습니다 enter image description here

사이트가 2 개 이상인 경우 dplyr을 직접 사용하는보다 유연한 솔루션이 필요할 수 있습니다.

+0

고마워,하지만 그건 내가 바라는 바대로 작동하지 않는다. 차트의 위와 아래는 데이터와 일치해야합니다. 나는 무언가를 통해 내가 게시 할 해결책을 관리 해왔다. – Greg

+0

이전 버전에 대해 유감스럽게 생각합니다. 높이를 다시 계산/추가하는 단계를 놓쳤습니다. (어리석은 실수이지만, 지금은 고정되어 있습니다. 확실히'geom_rect'를 사용하는 것보다 낫지는 모르지만) –

+0

감사합니다. 나는 긍정적/부정적인 결과에 따라 요인을 설정하는 방법을 좋아합니다. 나는 그것을 사용할 것이다. – Greg

1

@Gregor의 의견을 사용하면 작동할만한 것을 고를 수있었습니다. 아마 가장 우아한 해결책은 아니지만 지금은 효과가있을 것입니다.

df %>% 
    spread(site, value) %>% 
    mutate (diff = SiteA - MainSite) %>% 
    mutate (AboveBelow = recode (diff," -100:-1 = 'Below'; 
           0 = 'No Difference'; 
           1:100 = 'Above'")) %>% 
    ggplot() + 
    scale_x_continuous(name = "Year", breaks = c (2013, 2014, 2015)) + 
    scale_y_continuous(name = "Percentage", limits = c(0,100)) + 
    geom_rect (aes (xmin = year - 0.33, xmax = year + 0.33, ymin = SiteA, ymax = MainSite, fill = AboveBelow)) + 
    geom_text (aes (x = year, y = ifelse (diff < 0, MainSite + 5, MainSite - 3), label = paste0("MainSite - ", MainSite))) + 
    geom_text (aes (x = year, y = ifelse (diff < 0, SiteA - 3, SiteA +5), label = paste0("SiteA - ", SiteA))) + 
    geom_text (aes (x = year, y = MainSite + (diff/2), label = diff)) + 
    scale_fill_manual(values = c("green", "red", "white")) 

나에게주는이 :

enter image description here

관련 문제