2017-09-22 10 views
0

다음 데이터 (이미 긴 형식 임)에서 ggplot2으로 막 대형 차트를 그릴 수 있습니다. 변수의 값은 geom_text() 지시문을 통해 막대의 중간에 배치됩니다. 그냥 수동으로 그림에 추가 -R : 변수의 조합으로 된 텍스트를 ggplot의 막대 위에 배치

stuff.dat<-read.csv(text="continent,stuff,num 
America,apples,13 
America,bananas,13 
Europe,apples,30 
Europe,bananas,21 
total,apples,43 
total,bananas,34") 

library(ggplot2) 
ggplot(stuff.dat, aes(x=continent, y=num,fill=stuff))+geom_col() + 
     geom_text(position = position_stack(vjust=0.5), 
       aes(label=num)) 

는 이제 바 = 사과/바나나 F로 정의된다 "애플 바나나 지수"의 상단에 추가하는 것이 필요하다. ggplot에서 이것을 프로그래밍하는 방법은 무엇입니까? 범례에 별도의 항목으로 추가하는 것이 어떻게 가능합니까?

simple stacked bar chart

+0

:이 가능한 솔루션입니다? 이 수치는 파악하기가 너무 어렵고 지금이 추가 정보가 필요합니다. – PoGibas

답변

1

나는 이것을 달성하는 가장 쉬운 방법은 플롯을 작성하기 전에 데이터를 준비하는 것이라고 생각합니다.

abi <- function(cont) { 
    with(stuff.dat, 
     num[continent == cont & stuff == "apples"]/num[continent == cont & stuff == "bananas"] 
) 
} 

그리고 내가 필요한 모든 데이터와 데이터 프레임 생성 : 이제

conts <- levels(stuff.dat$continent) 
abi_df <- data.frame(continent = conts, 
        yf = aggregate(num ~ continent, sum, data = stuff.dat)$num + 5, 
        abi = round(sapply(conts, abi), 1)) 

을, 내가 할 수있는 나는 대륙 주어진 stuff.dat에서 사과 바나나 인덱스를 계산하는 기능 abi()를 정의 플롯에 해당 정보를 추가

library(ggplot2) 
ggplot(stuff.dat, aes(x = continent, y = num, fill = stuff)) + 
    geom_col() + 
    geom_text(position = position_stack(vjust = 0.5), aes(label = num)) + 
    geom_text(data = abi_df, aes(y = yf, label = paste0("f = ", abi), fill = NA)) 

enter image description here

fill = NA을 추가하면 약간의 해킹이 발생하며 경고 메시지가 표시됩니다. 그러나 fill을 설정하지 않으면 플로팅이 실패하고 stuff이라는 메시지가 표시됩니다. 또한 geom_col()ggplot()에서 fill = stuff를 이동하려고하지만이 막대 내부의 텍스트 레이블의 y⁻coordinate 나누기. 이 문제에 대한 더 깔끔한 해결책이있을 수 있지만 아직 찾지 못했습니다. 하나는 쉽게 그림 영역 외부에 텍스트를 추가 할 수 없기 때문에 추가 범례를 추가

은, 불행하게도, 사소한하지 않습니다. 실제로는 두 단계가 필요합니다. 첫 번째 단계는 annotation_custom()을 사용하여 텍스트를 추가합니다. 그렇다면, 당신은 (예를 들어, 참조 here를) 텍스트를 볼 수 있도록 클리핑을 해제해야합니다. 당신은 정상 바 음모 텍스트를 필요로하지 않을 것을 알고

p <- ggplot(stuff.dat, aes(x = continent, y = num, fill = stuff)) + 
     geom_col() + 
     geom_text(position = position_stack(vjust = 0.5), aes(label = num)) + 
     geom_text(data = abi_df, aes(y = yf, label = paste0("f = ", abi), fill = NA)) + 
     guides(size = guide_legend(title = "f: ABI", override.aes = list(fill = 1))) + 
     annotation_custom(grob = textGrob("f: ABI\n(Apple-\nBanana-\nIndex", 
             gp = gpar(cex = .8), just = "left"), 
             xmin = 3.8, xmax = 3.8, ymin = 17, ymax = 17) 

# turn off clipping 
library(grid) 
gt <- ggplot_gtable(ggplot_build(p)) 
gt$layout$clip[gt$layout$name == "panel"] <- "off" 
grid.draw(gt) 

enter image description here