2017-03-15 1 views
0

원형 차트를 만들고 각 조각의 값으로 레이블을 지정하려고합니다. 데이터 프레임에 정보가 있지만, 보려는 열은 함수 호출에 정의되어야합니다.데이터 프레임 열의 막대/원형 차트 레이블

코드가 길어 지지만 1 줄만 변경하면됩니다. 나는 mainsym, as.symbol, as.name, quote, 그리고 내가 쓸모없는 것을 던질 수있는 다른 것들을 시도했다.

감사

library(dplyr) 
library(ggplot2) 
library(gridExtra) 

pie_chart <- function(df, main, labels, labels_title=NULL) { 
    mainsym <- as.symbol(main) 
    labelssym <- as.symbol(labels) 
    # convert the data into percentages. add label position and inner label text 
    df <- df %>% 
    mutate(perc = mainsym/sum(mainsym)) %>% 
    mutate(label_pos = 1 - cumsum(perc) + perc/2, 
      inner_label_text = paste0(round(perc * 100), "%\n",main)) #NEED HELP HERE! Replace 'main' with something 

    #debug print statement 
    print(df) 

    # reorder the category factor levels to order the legend 
    df[[labels]] <- factor(df[[labels]], levels = unique(df[[labels]])) 

    p <- ggplot(data = df, aes_(x = factor(1), y = ~perc, fill = labelssym)) + 

    # make stacked bar chart with black border 
    geom_bar(stat = "identity", color = "black", width = 1) + 

    # add the percents and values to the interior of the chart 
    geom_text(aes(x = 1.25, y = label_pos, label = inner_label_text), size = 4) + 

    # convert to polar coordinates 
    coord_polar(theta = "y",direction=-1) 

    return(p) 
} 

set.seed(42) 
donations <- data.frame(donation_total=sample(1:1E5,50,replace=TRUE)) 
donation_size_levels_same <- seq(0,2E6,10E3) 
donations$bracket <- cut(donations$donation_total,breaks=donation_size_levels_same,right=FALSE,dig.lab = 50) 

donations.by_bracket <- donations %>% 
    group_by(bracket) %>% 
    summarize(n=n(),total=sum(donation_total)) %>% 
    ungroup() %>% 
    arrange(bracket) 

grid.arrange(
    pie_chart(df=donations.by_bracket,main="n",labels="bracket",labels_title="Total Amount Donated"), 
    pie_chart(df=donations.by_bracket,main="total",labels="bracket",labels_title="Total Amount Donated")) 

답변

1

은 라벨의 위치는 여전히 조정이 필요하지만, 이것은 그냥 다음과 같이 (당신이 여기에 도움이 필요 말) 그 한 줄을 교체하는 경우, 라벨의 문제를 해결하기 보인다

mutate(label_pos = 1 - cumsum(perc) + perc/2, 
     inner_label_text = paste0(round(perc * 100), "%\n",as.character(df[[main]]))) 
관련 문제