18

我一直在试验这两者ggplot2lattice绘制数据面板。我在思考ggplot2模型时遇到了一些麻烦。特别是,如何在每个面板上绘制包含两组数据的散点图:

lattice我可以这样做:

xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd)

这会给我每个 State_CD 的面板和每列

我可以做一列ggplot2

pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2) 
      + facet_wrap(~ State_CD) + opts(aspect.ratio = 1)
print(pg)

我无法理解的是如何将 Actual_value 添加到上面的 ggplot 中。

EDIT Hadley 指出,使用可重现的示例确实会更容易。这是似乎有效的代码。有没有更好或更简洁的方法来用 ggplot 做到这一点?为什么向 ggplot 添加另一组点的语法与添加第一组数据的语法如此不同?

library(lattice)
library(ggplot2)

#make some example data
dd<-data.frame(matrix(rnorm(108),36,3),c(rep("A",24),rep("B",24),rep("C",24)))
colnames(dd) <- c("Predicted_value", "Actual_value", "x_value", "State_CD")

#plot with lattice
xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd)

#plot with ggplot
pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2) + facet_wrap(~ State_CD) + opts(aspect.ratio = 1)
print(pg)

pg + geom_point(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green")

格子输出如下所示:( 来源:cerebralmastication.com替代文字

和 ggplot 看起来像这样:( 来源:cerebralmasastication.com替代文字

4

4 回答 4

19

只需遵循 Ian 的建议:对于 ggplot2,您确实希望将所有 y 轴内容放在一个列中,并将另一列作为指示您想要如何装饰它的因素。很容易做到这一点melt。以机智:

qplot(x_value, value, 
      data = melt(dd, measure.vars=c("Predicted_value", "Actual_value")), 
      colour=variable) + facet_wrap(~State_CD)

这是我的样子:( 来源:princeton.edu替代文字

为了了解melt实际在做什么,这里是头:

> head(melt(dd, measure.vars=c("Predicted_value", "Actual_value")))
     x_value State_CD        variable      value
1  1.2898779        A Predicted_value  1.0913712
2  0.1077710        A Predicted_value -2.2337188
3 -0.9430190        A Predicted_value  1.1409515
4  0.3698614        A Predicted_value -1.8260033
5 -0.3949606        A Predicted_value -0.3102753
6 -0.1275037        A Predicted_value -1.2945864

您会看到,它将 Predicted_value 和 Actual_value “融合”到一个名为的列中value,并添加另一列名为,variable让您知道它最初来自哪个列。

于 2009-08-21T21:36:39.340 回答
6

更新:几年过去了,我几乎总是在 ggplot2 中使用 Jonathan 的方法(通过tidyr 包)。我在下面的回答在紧要关头工作,但当你有 3 个以上的变量时会很快变得乏味。


我确信 Hadley 会有更好的答案,但是 - 语法不同,因为ggplot(dd,aes())语法(我认为)主要用于仅绘制一个变量。对于两个,我会使用:

ggplot() + 
geom_point(data=dd, aes(x_value, Actual_value, group=State_CD), colour="green") + 
geom_point(data=dd, aes(x_value, Predicted_value, group=State_CD), shape = 2) + 
facet_wrap(~ State_CD) + 
theme(aspect.ratio = 1)

将第一组点从 ggplot() 中提取出来会得到与第二组相同的语法。我发现这更容易处理,因为语法相同,并且强调了 ggplot2 核心的“图形语法”。

于 2009-08-21T21:36:23.770 回答
2

您可能只想稍微更改数据的形式,以便拥有一个 y 轴变量,以及一个额外的因子变量,指示它是预测变量还是实际变量。

这就像你想要做的事情吗?

dd<-data.frame(type=rep(c("Predicted_value","Actual_value"),20),y_value=rnorm(40),
                x_value=rnorm(40),State_CD=rnorm(40)>0)
qplot(x_value,y_value,data=dd,colour=type,facets=.~State_CD)
于 2009-08-21T20:35:27.793 回答
1

在发布问题之后,我遇到了这个可能对我有帮助的R 帮助线程。看起来我可以这样做:

 pg + geom_line(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green") 

这是做事的好方法吗?这对我来说很奇怪,因为添加第二项的语法与第一项完全不同。

于 2009-08-21T20:11:49.200 回答