堆积条形图,在单独的列中包含百分比

时间:2015-04-18 16:10:34

标签: r ggplot2

我正在尝试使用ggplot2或r中的barplot函数绘制带有以下数据的堆积条形图。我两个都失败了。

str(ISCE_LENGUAJE5_APE_DEC)
'data.frame':   50 obs. of  5 variables:
$ Nombre             : Factor w/ 49 levels "C.E. DE BORAUDO",..: 6 5 25 21 16 7 27 45 24 38 ...
$ v2014_5L_porNivInsu: int  100 93 73 67 67 65 63 60 59 54 ...
$ v2014_5L_porNivMini: int  0 7 22 26 32 32 37 26 34 35 ...
$ v2014_5L_porNivSati: int  0 0 4 6 2 3 0 12 6 10 ...
$ v2014_5L_porNivAvan: int  0 0 1 2 0 0 0 2 1 2 ...

整数是百分比值:它们是每个观察值的v2014 ...列的总和为100.

我曾尝试使用ggplot2,但我只设法绘制其中一个变量,而不是全部四个的堆积条。

ggplot(ISCE_LENGUAJE5_APE_DEC, aes(x=Nombre, y= v2014_5L_porNivInsu)) + geom_bar(stat="identity")

我无法弄清楚如何将所有四列的值传递给 y 参数。

如果我只传递x,我会收到错误:

ggplot(ISCE_LENGUAJE5_APE_DEC, aes(x=Nombre)) + geom_bar(stat="identity")
Error in exists(name, envir = env, mode = mode) : 
argument "env" is missing, with no default

我找到this answer,但不了解所使用的数据转换。感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

ggplot2使用以“long”格式表示的数据。来自包reshape2的功能融化是你的朋友。

因为您没有提供可重现的示例,所以我生成了一些数据。

v2014 <- data.frame(v2014_5L_porNivInsu = sample(1:100, 50, replace = TRUE),
                    v2014_5L_porNivMini = sample(1:50, 50, replace = TRUE),
                    v2014_5L_porNivSati = sample(0:10, 50, replace = TRUE),
                    v2014_5L_porNivAvan = sample(0:2, 50, replace = TRUE))

v2014_prop <- t(apply(dummy[, -1], 1, function(x) {x / sum(x) * 100}))

ISCE_LENGUAJE5_APE_DEC <- data.frame(Nombre = factor(sample(1:100, 50)),
                                     v2014_prop)

您首先使用“熔化”以长格式表达您的表格。

library(reshape2)
gg <- melt(ISCE_LENGUAJE5_APE_DEC, id = "Nombre")

了解您的新表gg的外观。

str(gg)
head(gg)

在你的ggplot中,你使用data.frame gg。 x轴是Nombre,y轴是值,即比例,由变量列定义的不同填充颜色分段,在这里您可以找到v2014 _...表示为因子级别而不是列标题,这要归功于融合功能

library(ggplot2)
ggplot(gg, aes(x = Nombre, y = value, fill = variable)) + 
  geom_bar(stat = "identity")