如何使用stat="identity"绘制ggplot分组条形图?

7

我有一个包含两列A和B的数据框。我想制作一个并排(dodged)显示A和B值的条形图。我在谷歌上搜索到了ggplot2包中的ggplot函数。默认情况下,它会使用频率生成条形图,但有一个选项stat="identity"可以明确地选择一个变量来设置条形高度。我可以这样绘制一列:

d <- data.frame(A=c(1:10), B=c(11:20))
ggplot(data=d, aes(x=1:length(A), y=A))+geom_bar(stat="identity", position="dodge")

如何将两列数据并排绘制?我可以重新构造我的数据框:将向量A和B的值附加到一个列中,并创建一个指示变量ind,然后使用它来定义组aes(group=ind)。是否可以在不修改其结构的情况下使用数据框d完成此操作?

2个回答

7
您可以使用reshape2包中的melt函数来创建您所需的图表。
library(reshape2)
d$ind <- seq_along(d$A)

d.m <- melt(d, id.var='ind')

ggplot(d.m, aes(x=ind, y=value, fill=variable)) + 
  geom_bar(stat='identity', position='dodge')

一般来说,当您提供单个数据框包含所有数据时,ggplot 的效果最佳。对于每种几何类型至少一个数据框。


这意味着更改原始数据框。我想知道是否有一个参数/选项可以提供给ggplot,以使用来自多个列的值。在接受您的答案之前,我会等一会儿。谢谢。 - user443854
有方法,但它们并不美观。正如我在编辑中提到的那样,在绘图之前,如果您可以将数据格式化为上述格式,那么ggplot通常效果最佳。如果您不想在全局环境中更改数据框,则可以在函数中进行更改。只需记得在这种情况下使用print来包装您的ggplot调用即可! - Justin
@Justin是正确的。你应该改变数据输入到'ggplot'函数的方式。'ggplot'函数以不转换数据而著名,因此最好手动重塑数据以首先适应您的需求。我已经添加了一个答案,显示如何在线处理此操作,但是Justin使用'melt'的方法是推荐的方法。'reshape'包是几乎每个人都应该学习的基础工具之一。 - Dinre
太棒了,我以前不知道我可以同时使用identity和dodge。酷! - Matt Bannert

4

实现此目的的唯一方法是重新排列您的数据以适应“ggplot”函数的需求。然而,如果您想在一行内完成所有操作,可以这样手动重塑数据:

ggplot(data=data.frame(value=c(d$A, d$B), variable=c(rep("A",10),rep("B",10))), aes(x=c(1:10,1:10), y=value, fill=variable))+geom_bar(stat="identity", position="dodge")

在这里,我已经从旧数据框架中创建了一个新的数据框架,并分配了相应的变量名称(这是 'reshape2' 包使用 'melt' 函数完成的)。然后,我手动将 x 值分别指定为 1:10 用于 "A" 和 1:10 用于 "B" ,以使柱形图显示在一起,而不是按顺序从 1:20 排列。我添加了一个 'fill' 参数以更改柱形图的颜色,以表示 "A" 或 "B"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接