2

我目前有一个数据集,其格式为:(x, y, type)

我使用了在通过 R 使用 Postgres 进行绘图的示例中找到的代码。

我的问题是:如何让 R 为每个唯一的“类型”列生成多个图表?

我是 R 新手,所以如果这是非常简单的事情,我很抱歉,我只是缺乏对 R 循环的理解。

所以假设我们有这些数据:

(1,1,T), (1,2,T), (1,3,T), (1,4,T), (1,5,T), (1,6,T), 
(1,1,A), (1,2,B), (1,3,B), (1,4,B), (1,5,A), (1,6,A), 
(1,1,B), (1,2,B), (1,3,C), (1,4,C), (1,5,C), (1,6,C), 

它将在页面上绘制 4 个单独的图表。T、A、B 和 C 类型各有一个。[绘制 x,y]

当传入的数据可能看起来像上面的数据时,我将如何使用 R 执行此操作?

4

3 回答 3

6

虽然另一篇文章有​​一些很好的信息,但有一种更快的方法可以做到这一点。因此,假设您的数据框或矩阵被调用DF并且采用上面的形式(其中每个(1,2,B)或任何内容都是一行),那么:

by(DF, DF[,3], function(x) plot(x[,1], x[,2], main=unique(x[,3])))

就是这样。

如果您希望所有四个图都在同一页面上,您可以首先更改绘图paramter 选项:

par(mfrow=c(2,2))

完成后恢复默认值par(mfrow=c(1,1)

于 2012-11-08T21:52:24.963 回答
4

我非常喜欢这个ggplot2包,它与 user1717913 建议的功能相同,但语法略有不同(它可以很好地完成许多其他事情,这就是我喜欢它的原因。)

test <- data.frame(x=rep(1,18),y=rep(1:6,3),type=c("T","T","T","T","T","T","A","B","B","B","A","A","B","B","C","C","C","C"))

require(ggplot2)
ggplot(test, aes(x=x, y=y)) + #define the data that the plot will use, and which variables go where
  geom_point() + #plot it with points
  facet_wrap(~type) #facet it by the type variable

在此处输入图像描述

于 2012-11-08T21:57:55.957 回答
1

R真的很酷,因为有很多(这是一个技术术语)不同的方式来做大多数事情。我会做的是将数据沿组拆分,然后按组绘制。
为此,该split命令就是您想要的(我假设您的数据在一个名为 的对象中data):

data.splitted <- split(data, data$type)

现在数据将具有这种形式(假设您有 3 种类型,A、B 和 C):

data.splitted  
 L A
 | L x y type
 |   1 4  A
 |   3 6  A
 L B
 | L x y type
 |   3 3  B
 |   2 1  B
 L C
   L x y type
     4 5  C
     5 2  C

等等。您将在 A 组的 y 列中引用“4”,如下所示:

data.splitted$A$y[1]或者data.splitted[[1]][[2]][1]希望看到他们俩在一起就足够有意义了。

现在我们有了数据拆分,我们越来越接近了。
我们仍然需要告诉R我们想要在同一个窗口中绘制一堆图表。现在,这只是解决问题的一种方法。您还可以告诉它将每个图形写入图像文件、pdf 或任何您想要的文件。
groups <- names(data.splitted)将您的不同类型放入变量中以供以后参考。

par(mfcol=c(length(groups),1))

使用 mfcol 垂直填充图形。mfrow 选项水平填充。c()只是结合输入。返回组的length(groups)总数。
现在我们可以处理for循环了。

for(i in 1:length(data.splitted)){   #  This tells it what i is iterating from and to.
                                     #    It can start and stop wherever, or be a 
                                     #    sequence, ascending or descending,
                                     #    the sky is the limit.
tempx <- data.splitted[[i]][[x]]     #  This just saves us
tempy <- data.splitted[[i]][[y]]     #    a bunch of typing.
plot(tempx, tempy, main=groups[i])   #  Plot it and make the title the type.
rm(tempx, tempy)                     #  Remove our temporary variables for the next run through.    
}

所以你看,当你把它分解成它的组件时,它并不算太糟糕。你几乎可以用这种方式做任何事情。我现在正在处理一个项目,我正在为 18 个激光雷达指标执行此操作,这些指标是我使用另一个for 循环计算的。要阅读的命令:

split, plot, data.frame, "[", 
par(mfrow=___) and par(mfcol=___)

这里一些有用的链接 可以帮助您入门。最有用的一个是内置的R。a?后跟命令将在浏览器中显示该命令的 html 帮助。
祝你好运!

于 2012-11-08T21:00:44.500 回答