带有聚合数据的R堆积条形图

7
我遇到了创建带有聚合数据的堆叠条形图的问题。当处理来自他人报告的聚合表时,我通常使用Excel,但我想开始在R中制作所有的图表,可能使用lattice或ggplot。在Excel中,对以下聚合数据进行堆叠条形图只需要点击几下(插入、列图、堆叠列),你会得到这样的结果。enter image description here
除了想在R中制作此图表外,我还想使用ggplot的分面功能,即在ggplot中并排放置两个堆叠条形图以比较两个组(A和B)。我已经尝试了其他图表,这似乎是最好的选择。这是数据。Excel图表仅显示组A(数字为百分比)。
D<-as.data.frame(structure(list(Group = c("A", "A", "A", "A", "A", 
"A", "B", "B", "B", "B", "B", "B"
), Education = c("NVQ Level 4 and above", "NVQ Level3", "NVQ Level 2", 
"Below NVQ Level 2", "Other qualification", "No qualification", 
"NVQ Level 4 and above", "NVQ Level3", "NVQ Level 2", "Below NVQ Level 2", 
"Other qualification", "No qualification"), Full.Time = c(47, 
27, 23, 17, 18, 9, 36, 26, 22, 22, 27, 12), PT.16.hours = c(20, 
24, 22, 18, 18, 12, 22, 21, 21, 22, 14, 10), PT.16.hours.1 = c(12, 
11, 10, 11, 13, 5, 24, 25, 25, 20, 16, 12)), .Names = c("Group", 
"Education", "Full.Time", "PT>16.hours", "PT<16.hours")))

在展示两组差异的分面之前,我遇到了一个问题,就是用ggplot2无法创建单个堆积条形图(就像上面那个)。我猜想我不应该有三个变量(全职、兼职、每周工作超过16小时的兼职),而应该为每种情况只有一行,因此不应该使用“宽格式”。
A    NVQ Level 4 and above      47  20  12
A    NVQ Level3                 27  24  11

I should have

Group          Education    Work     Percentage
A   NVQ Level 4 and above   Full Time   47
A   NVQ Level 4 and above   PT>16 hours 20

如果这是唯一的方法让ggplot绘制图表,您将如何通过几行代码从一个格式更改为另一个格式?我经常遇到这种类型的数据,因此拥有标准化的过程会很好。我也尝试了ggplot选项“identity”,但没有取得太多成功。
非常感谢任何帮助。
谢谢
2个回答

8

reshape 操作可以重塑数据:

library(reshape2)
df <- melt(D)

并且只需简单绘制它 :)
ggplot(df, aes(x = factor(Education), y = value, fill = factor(variable))) +
geom_bar() + facet_grid(.~Group) +
ylab('') + xlab('') + opts(title = '') + scale_fill_discrete('') +
theme_bw() +
opts(axis.text.x=theme_text(angle = 45, hjust = 1, vjust = 1))

第一行设置了美学属性,第二行添加了bar层和facet,第三行从图表中删除了不需要的文本,第四行设置了b&w主题,在最后一行我们旋转了x轴标签。

enter image description here


3

技巧在于使用plyr包中的melt函数将三个测量列融合成一个(新命名为value的列),同时加入一个标识列(命名为variable)进行分组:

require(ggplot2)
require(reshape)

# first we need to get Full.Time, PT.16, etc. into one column
df <- melt(D, .measure.vars=.(Full.Time, PT.16.hours, PT.16.hours.1))
ggplot(df, aes(x=Education, y=value, fill=variable )) +
  geom_bar(stat="identity")

其余的只是重新排列因素,以使输出与您想要的相匹配。
查看`df`以查看melt最终执行的操作,因为它是ggplot2的常见工作流程。
使用适当的`facet_wrap`即可进入到一个分面图。只需添加相应的“Group”因子即可:
ggplot(df, aes(x=Education, y=value, fill=variable )) +
  geom_bar(stat="identity") +
  facet_wrap(~ Group)

facetted plot


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