7

我在创建带有聚合数据的堆叠条形图时遇到了麻烦。在处理来自其他人报告的汇总表时,我通常使用 Excel,但我想开始在 R 中制作我的所有图表,可能使用 lattice 或 ggplot。在 Excel 中,对以下聚合数据进行堆叠条形图需要单击几下(插入、柱形图、堆叠列),然后您会得到类似的结果。在此处输入图像描述.

除了想在 RI 中使用此图表外,还想使用 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 创建单个堆叠条形图(如上图)时遇到了麻烦。我猜我不应该有 3 个变量(FullTime,PT,PT>16 hours),而是每个案例的单行,所以不要有

A    NVQ Level 4 and above      47  20  12
A    NVQ Level3                 27  24  11

我应该

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 选项“身份”,但没有取得太大成功。

任何帮助将非常感激。

谢谢

4

2 回答 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 asis 标签。

在此处输入图像描述

于 2012-07-28T20:04:28.770 回答
3

诀窍是使用包装将三个测量meltplyr列融合为一个(一个名为 的新列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")

其余的只是重新排序因子,以便输出与您想要的匹配。

看看dfmelt 最终做了什么,因为它是 ggplot2 的常见工作流程。

阴谋

要使用因子移动到多面图,Group只需添加适当的facet_wrap

ggplot(df, aes(x=Education, y=value, fill=variable )) +
  geom_bar(stat="identity") +
  facet_wrap(~ Group)

刻面图

于 2012-07-28T19:52:14.027 回答