数据框列中的条形图/饼图标签

时间:2017-03-15 23:53:36

标签: r

我正在制作一个饼图,并希望用每个切片的值标记它。我在数据框中有信息,但是应该在函数调用中定义要查看的列。

代码是(相当)长,但我认为只需要改变1行。我尝试了mainsymas.symbolas.namequote以及我能想到的任何其他内容,但无济于事。

由于

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 个答案:

答案 0 :(得分:1)

标签展示位置仍然需要进行一些调整,但这似乎解决了标签问题,如果你只是替换那一行(你在这里需要帮助),如下所示:

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