将ggplot与ddply结合使用

时间:2013-02-05 15:11:27

标签: r ggplot2 plyr

我有如下样本数据test.data

income  expend  id
9142.7  1576.2  1
23648.75 2595   2
9014.25 156 1
4670.4  604.4   3
6691.4  3654.4  3
14425.2 66  2
8563.45 1976.2  2
2392    6   1
7915.95 619.2   3
4424.2  504.2   2

我首先使用ddply来获取每个id的平均收入和支出

library(plyr)
group<-ddply(test.data, .id,summarize, income.mean=mean(income),expend.mean=mean(expend))

现在,我使用ggplot2中的情节函数通过income.mean and expend.mean

绘制id.
library (ggplot2)
plot.income<-qplot(id,income.mean,data=group)
plot.expend<-qplot(id,expend.mean,data=group)

虽然上面的代码运行没有任何错误,但我正在寻找在ddply中组合qplot函数的有效方法,反之亦然。此外,如果我需要将这两个图组合在一起,我该怎么做?

谢谢。

3 个答案:

答案 0 :(得分:3)

我认为你想要的是要求从'qplot'函数切换到'ggplot'函数。在'ddply'函数中包含图形函数不会很漂亮,反之亦然。你最好将它们分开,所以我将专注于组合图形。我认为有两种方法可以做到这一点:

选项1 :只需在同一个'ggplot'对象上将两个绘图作为单独的几何图形。这不是两个难以做到的,并且是这样的:

ggplot(group) + geom_point(aes(x=id, y=income.mean), colour="red") + geom_point(aes(x=id, y=expend.mean), colour="blue")

这是一个快速选项,可以通过最少的计算完成工作。但是,它要求您为每列指定新几何。在您的示例数据中,这不是问题,但在许多情况下,您希望使用代码执行此操作,而不是手动执行此操作。

选项2 :重塑数据以将两个集合组合在一个图表中。然后,我们可以通过变量

进行着色来指定分组
library(reshape2)
plot_Data <- melt(group, id="id")

# Output of plot_Data
#   id    variable     value
# 1  1 income.mean  6849.650
# 2  2 income.mean 12765.400
# 3  3 income.mean  6425.917
# 4  1 expend.mean   579.400
# 5  2 expend.mean  1285.350
# 6  3 expend.mean  1626.000

ggplot(plot_Data, aes(x=id, y=value, col=variable)) + geom_point()

chart example

这种方法的缺点是我们正在进行更多的计算,因此大型复杂数据帧的处理速度可能会变慢。然而,优势(这是巨大的)是我们不必知道我们正在绘制的数据框中存在哪些列。在没有我们干预的情况下,所有东西都被分类,着色和绘制,因此我们可以灵活地使用它来处理任何事情。

您应该可以从这里进行调整以满足您的需求。

答案 1 :(得分:2)

要合并这两个图,我必须将reshape2包放入melt数据:

library(ggplot2)
library(plyr)
library(reshape2)

test.data <- read.table(text="income  expend  id
                 9142.7  1576.2  1
                 23648.75 2595   2
                 9014.25 156 1
                 4670.4  604.4   3
                 6691.4  3654.4  3
                 14425.2 66  2
                 8563.45 1976.2  2
                 2392    6   1
                 7915.95 619.2   3
                 4424.2  504.2   2", header=TRUE)

qplot(data=melt(ddply(test.data, .(id), colwise(mean)), id.vars="id"), x=id, y=value, colour=variable)

enter image description here

答案 2 :(得分:1)

嗯,你的问题不是很精确,因为我们不知道你到底想做什么。但这是一个猜测:

d <- read.table(textConnection("income  expend  id
9142.7  1576.2  1
23648.75 2595   2
9014.25 156 1
4670.4  604.4   3
6691.4  3654.4  3
14425.2 66  2
8563.45 1976.2  2
2392    6   1
7915.95 619.2   3
4424.2  504.2   2"), header=TRUE)

library(reshape2)
d2 <- melt(d, id.var="id")
ggplot(data=d2, aes(x=id,y=value)) + stat_summary(fun.y="mean", geom="bar") + facet_grid(.~variable)

会给:

enter image description here