如何在R中拆分数据集和绘图

时间:2011-01-20 19:33:26

标签: r plot split lattice

我使用的数据集如下:

1  48434  14566
1  56711  6289
1  58826  4174
2  56626  6374
2  58888  4112
2  59549  3451
2  60020  2980
2  60468  2532
3  56586  6414
3  58691  4309
3  59360  3640
3  59941  3059
.
.
.
10  56757  6243
10  58895  4105
10  59565  3435
10  60120  2880
10  60634  2366

对于第一列的每个值,我需要在第3列的R中的图,即对于上面的数据,将存在10个不同的第3列值(每组1-10)的图。 x轴是迭代次数,Y轴是最大值63000的值。我还需要用红色的线连接点。 我是R的新手并且一直在阅读文档,但这让我更加困惑。可以任何身体帮助。

编辑:我实际上想要V3值的折线图。 v3列的行数将在x轴上,v3值在y轴上。并且我想要由v1指示的组各自的不同图形。 Chase的解决方案有效,只是我希望轴移位,V3值应该在y轴上。这是示例 alt text

EDIT2:@Roman,这是我正在执行的代码。

library(lattice)
d <- read.delim("c:\\proj58\\positions23.txt",sep="")
d <- do.call(rbind, lapply(split(d, d$V1), function(x) {
    x$iterations <- order(x$V3, decreasing=TRUE)
    x
}))
xyplot(V3 ~ iterations | V1, type="l", data=d)

这是我得到的错误,

    > 
>  source("C:\\proj58\\plots2.R")
> d
       V1    V2    V3 iterations
1.1     1 48434 14566          1
1.2     1 56711  6289          2
1.3     1 58826  4174          3
1.4     1 59528  3472          4

我没有得到任何情节?我错过了什么 好的,我知道了。不知道出了什么问题。在这里,

alt text

另外2件事,如何将盒子上的V1标签更改为实际数字,如1,2,...... 其次,我有包含100个组的文件,我尝试了一个,它在一个页面上显示所有图形(显然不可读),我可以在多个窗口上制作这些吗?

3 个答案:

答案 0 :(得分:2)

那么,首先需要为第一个变量的每个子集分别创建一个带行号的变量。这是一种方法,通过将数据集拆分为第一个变量,创建一个具有行号的新变量,然后重新组合。

您也可能希望V1成为一个因子(分类变量)。

d <- do.call(rbind, lapply(split(d, d$V1), function(x) {
    x$iterations <- 1:nrow(x)
    x
}))
d$V1 <- factor(d$V1)

然后使用lattice库,您可以执行类似

的操作
xyplot(V3 ~ iterations | V1, type="l", data=d)

要使图表显示在多个页面上,请使用layout选项限制页面上的图表数量。您需要将绘图保存到支持多页输出的文件中才能执行此操作。例如,对于5行和5列:

trellis.device("pdf", file="myplot.pdf")
p <- xyplot(V3 ~ iterations | V1, type="l", data=d, layout=c(5,5))
plot(p)
dev.off()

此外,要在使用source运行代码时显示绘图,您需要专门绘制xyplot命令的输出,例如

p <- xyplot(...)
plot(p)

在控制台上运行时,没有必要这样做,因为默认情况下会调用plot(实际上是print函数)。

答案 1 :(得分:1)

像Chase说的那样,请澄清你的问题,以便我们能够更好地设想你想要实现的目标。为了增加混乱,这里是我认为你可能会追求的lattice球场解决方案。

library(lattice)
fdt <- data.frame(col1 = seq(from = 1, to = 10, each = 10),
        col2 = round(56 * rnorm(100, mean = 30, sd = 5)),
        col3 = round(20 * rnorm(100, mean = 11,)))
xyplot(col3 ~ 1:100 | col1, data = fdt)

alt text

答案 2 :(得分:0)

我并没有完全遵循你想要绘制的内容,但这里的方法应该让你走上正确的道路,你可以填写适当的绘图命令......或者澄清你的问题并解释一下你的情节的最终结果应该更详细。

我们将利用两个包:plyrggplot2。我们将使用plyr将您的数据拆分为相应的组,然后使用ggplot2进行实际绘图。我们将利用pdf()函数并在每个页面上添加不同的图。

library(ggplot2)
library(psych)    #For copying in data, not needed beyond that.

df <- read.clipboard(header = F)

pdf("test.pdf")
    d_ply(df, "V1", function(x)     #Split on the first column
        print(qplot(x$V3))          #Your plotting command should go here. This plots histograms.
    )
dev.off()                           #Close the plotting device.

这将生成 n 页面PDF,其中 n 表示V1(您的拆分列)中的组数。如果您更喜欢JPEG输出,请查看?jpeg或其他图形选项以进行其他输出。

编辑:正如您所看到的,人们会以某种方式解释您的问题。如果@ Roman的解决方案更符合您的要求,这里的ggplot代码大致相同

qplot(col2, col3, data = fdt, geom = "point") + facet_wrap(~ col1 , nrow = 2)