49

我想使用 ggplot2 和 geom_bar 创建一个堆积图。

这是我的源数据:

Rank F1     F2     F3
1    500    250    50
2    400    100    30
3    300    155    100
4    200    90     10

我想要一个堆叠图表,其中 x 是排名,y 是 F1、F2、F3 中的值。

# Getting Source Data
  sample.data <- read.csv('sample.data.csv')

# Plot Chart
  c <- ggplot(sample.data, aes(x = sample.data$Rank, y = sample.data$F1))
  c + geom_bar(stat = "identity")

这是我所能得到的。我不确定如何堆叠其余的字段值。

也许我的 data.frame 格式不正确?

4

4 回答 4

47

你说 :

也许我的 data.frame 格式不正确?

是的,这是真的。您的数据是格式您需要将其放入格式。一般来说,长格式更适合变量比较

reshape2例如,您可以使用以下方法执行此操作melt

dat.m <- melt(dat,id.vars = "Rank") ## just melt(dat) should work

然后你得到你的条形图:

ggplot(dat.m, aes(x = Rank, y = value,fill=variable)) +
    geom_bar(stat='identity')

但是使用latticebarchart智能公式表示法,你不需要重塑你的数据,只需这样做:

barchart(F1+F2+F3~Rank,data=dat)
于 2014-01-20T14:20:48.867 回答
44

您需要将数据转换为长格式,并且不应$在内部使用aes

DF <- read.table(text="Rank F1     F2     F3
1    500    250    50
2    400    100    30
3    300    155    100
4    200    90     10", header=TRUE)

library(reshape2)
DF1 <- melt(DF, id.var="Rank")

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

在此处输入图像描述

于 2014-01-20T14:20:31.290 回答
6

基于 Roland 的回答,tidyr用于将数据从宽变长:

library(tidyr)
library(ggplot2)

df <- read.table(text="Rank F1     F2     F3
1    500    250    50
2    400    100    30
3    300    155    100
4    200    90     10", header=TRUE)

df %>% 
  gather(variable, value, F1:F3) %>% 
  ggplot(aes(x = Rank, y = value, fill = variable)) + 
  geom_bar(stat = "identity")

在此处输入图像描述

于 2018-02-19T20:41:15.740 回答
3

您将需要melt您的数据框将其转换为所谓的长格式:

require(reshape2)
sample.data.M <- melt(sample.data)

现在,您的字段值由它们自己的行表示,并通过变量列进行标识。现在可以在 ggplot 美学中利用这一点:

require(ggplot2)
c <- ggplot(sample.data.M, aes(x = Rank, y = value, fill = variable))
c + geom_bar(stat = "identity")

除了堆叠,您可能还对使用构面显示多个图感兴趣:

c <- ggplot(sample.data.M, aes(x = Rank, y = value))
c + facet_wrap(~ variable) + geom_bar(stat = "identity")
于 2014-01-20T14:20:40.750 回答