R-使用ggplot2的堆积条形图的总百分比 [英] R - Aggregate Percentage for Stacked Bar Charts using ggplot2

查看:221
本文介绍了R-使用ggplot2的堆积条形图的总百分比的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些看起来像下面的数据.我的目标是为它们生成堆积的条形图,但是我需要将这些值显示为百分比.我尽力使数据融化为正确的形状并绘制堆叠的条形图,但是这些值远远超过了100%(在我的实际数据集中,某些值加起来超过8000个).设置ggplot2的正确方法是什么,以便我可以按百分比创建堆叠的条形图?

I have some data that looks like the below. I'm aiming to generate stacked bar charts for them, but I need the values to be shown as percentages. I've managed to get as far as getting the data melted to the right shape and drawing the stacked bars, but the values go far beyond 100% (in my actual dataset, some values add up to 8000+). What is the correct way to setup ggplot2 so that I can create stacked bar charts in percentages?

#Raw Data
x   A    B    C
1   5   10   14
1   4    4   14
2   5   10   14
2   4    4   14
3   5   10   14
3   4    4   14

#Aggregate
data < read.table(...); 
data <- aggregate(. ~ x, data, sum) #<---- Sum to Average? 
x   A    B    C
1   9   14   28
2   9   14   28
3   9   14   28

#Melt Data
data <- melt(data,"x")
  x variable value
1 1        A     9
2 2        A     9
3 3        A     9
4 1        B    14
5 2        B    14
6 3        B    14
7 1        C    28
8 2        C    28
9 3        C    28

#Plot stack bar chart counts
ggplot(data, aes(x=1, y=value, fill=variable)) + geom_bar(stat="identity") + facet_grid(.~x)

我希望在融化之前得到类似的信息,以便可以融化并将其绘制为堆积的条形图,但是我不确定如何处理.

I'm hoping to get something like this before the melt so that I can melt it and plot that as a stacked bar chart, but I'm not sure how to approach this.

#Ideal Data Format - After Aggregate, Before Melt
x     A       B       C
1   17.64   27.45   54.90
2   17.64   27.45   54.90
3   17.64   27.45   54.90


问:使用ggplot2使用百分比创建堆积的条形图的正确方法是什么?


Q: What is the correct way to create a stacked bar chart with percentages, using ggplot2?

推荐答案

您可以使用融解数据计算比例.然后,您可以绘制一个图形.在这里,您可以使用dplyr包中的group_by计算每个x级别的比例.您还有其他选择.如果您想阅读mutate行,就像对于x的每个级别,我想获取percent".为了删除分组的变量x,我在最后添加了ungroup().

You can calculate proportion using your melt data. Then, you can draw a figure. Here, you can calculate proportion for each level of x using group_by in the dplyr package. You have other options as well. If you wanna read the mutate line, it is like "For each level of x, I want to get percent." In order to to remove the grouped variable, which is x, I added ungroup() in the end.

library(dplyr)
library(ggplot2)

### foo is your melt data
ana <- mutate(group_by(foo, x), percent = value / sum(value) * 100) %>%
       ungroup()

### Plot once
bob <- ggplot(data = ana, aes(x = x, y = percent, fill = variable)) +
       geom_bar(stat = "identity") +
       labs(y = "Percentage (%)")

### Get ggplot data
caroline <- ggplot_build(bob)$data[[1]]

### Create values for text positions
caroline$position = caroline$ymax + 1

### round up numbers and convert to character. Get unique values
foo <- unique(as.character(round(ana$percent, digits = 2)))

### Create a column for text
caroline$label <- paste(foo,"%", sep = "")

### Plot again
bob + annotate(x = caroline$x, y = caroline$position,
               label = caroline$label, geom = "text", size=3) 

数据

foo <-structure(list(x = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), variable = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
value = c(9L, 9L, 9L, 14L, 14L, 14L, 28L, 28L, 28L)), .Names = c("x", 
"variable", "value"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"))

这篇关于R-使用ggplot2的堆积条形图的总百分比的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆