在R中使用循环的多个绘图

在R中使用循环的多个绘图,r,loops,plot,dataframe,R,Loops,Plot,Dataframe,我仍在尝试使用循环在R中绘图。我想根据列x_1中的不同名称,在下面的数据框中绘图(任何可视化数据的绘图都可以)列z_1和z_2 x_1 <- c("A1", "A1","A1", "B10", "B10", "B10","B10", "C100", "C100", "C100") z_1 <- rnorm(10, 70) z_2 <- rnorm(10, 1.7) A <- data.frame(x_1, z_1, z_2) 使用循环的简单方法是 for (c

我仍在尝试使用循环在R中绘图。我想根据列x_1中的不同名称,在下面的数据框中绘图(任何可视化数据的绘图都可以)列z_1和z_2

x_1 <- c("A1", "A1","A1", "B10", "B10", "B10","B10", "C100", "C100", "C100")


z_1 <- rnorm(10, 70) 

z_2 <- rnorm(10, 1.7)

A <- data.frame(x_1, z_1, z_2)

使用循环的简单方法是

for (cat in unique(x_1)){
  d <- subset(A, x_1 == cat)
  plot(d$z_1, d$z_2)
}
for(cat in unique(x_1)){

d也许您不需要循环。请尝试使用ggu grid()。 下面是一个例子

library(ggplot2)
library(reshape2)

melted_a <- melt(A)


ggplot(melted_a, aes(variable, value)) +
  geom_jitter() +
  facet_grid(. ~ x_1)

ggplot(melted_a, aes(variable, value)) +
  geom_jitter() +
  facet_grid(variable ~ x_1)

这一想法来源于此。

为了理解原始代码无法工作的原因:

设置数据很好

x_1 <- c("A1", "A1", "A1", "B10", "B10", "B10","B10", "C100", "C100", "C100")
z_1 <- rnorm(10, 70) 
z_2 <- rnorm(10, 1.7)
A <- data.frame(x_1, z_1, z_2)
现在是for循环。让我们回顾一下R中的一个简单for循环(与“
?”for”中的示例非常接近):

非常简单,
1:5
c(1,2,3,4,5)
,所以首先
i
1
,然后
2
,等等。for循环在第一行有问题:

for (i in A$x_1[[i]]) { ## already a problem
首先,
i
A$x_1[[i]]
?这不起作用,
i
还没有定义。而且,
A$x_1
是一个向量,而不是一个列表,所以你不应该使用
[
对它进行子集划分。但我们还不想要子集,我们想要一个
i
应该采用的值向量。在这种情况下,我们想要的是
for(c中的i)(“A1”、“B10”、“C100”)
,但我们也希望以编程的方式完成,而不是键入所有不同的可能性。有两种常见的方法可以实现这一点:

unique(A$x_1) # as in Mark's solution
levels(A$x_1) # works because A$x_1 is a factor
我们可以在中的
之后放置这些表达式中的任何一个。我在绘图调用中将您的
[[
更改为
[
[[
仅用于列表。我还取出了不必要的
which()

让我们提醒自己什么是
i
值:
“A1”
“B10”
“C100”
A$x_1==A$x_1[“A1”]
将给出什么?没有什么有用的

for (i in unique(A$x_1)) {  
    plot(A[A$x_1 == i, ], aspect = 1)  # getting there
}
上面的代码绘制了一些东西,很简洁,但不是你想要的。有一堆警告,它们都告诉我们,
aspect
不是一个有效的参数,所以我们将删除它。查看绘图,你会看到它绘制了3个变量,因为我们没有告诉它在x轴和y轴上放置什么

for (i in unique(A$x_1)) {   
    plot(A[A$x_1==i, "z_2"], A[A$x_1==i, "z_1"])  # z_2 on x, z_1 on y 
}   # Works!!!
请注意,这与Mark的答案几乎相同。在for循环中,您不必使用
i
j
,他使用了
cat
。最好使用更具描述性的名称。 现在让我们想象一下:

for (i in unique(A$x_1)) {   
    plot(A[A$x_1==i, "z_2"], A[A$x_1==i, "z_1"],
         xlim = range(A$z_2), ylim = range(A$z_1), # base the axes on full data range
         main = paste("Plot of", i))  # Give each a title
}
下次:别忘了,你可以运行一小段代码来查看它们是什么。如果你有一行类似于
for(i in a$x_1[[i]])
的代码,你不确定它是否正确,请输入
a$x_1[[i]]
在控制台上,希望这能帮助您确定您尚未定义
i
,因此您可以将其更改为

for (i in A$x_1)

然后你运行
A$x_1
并意识到它的长度是10。你需要3个图形,而不是10个,所以你需要
i
来获取3个值,所有值都不同,等等。

你也会对数据进行调整,比如我在这里做的

如果我想让datewise绘图和xlab、ylab以及绘图标题有具体的细节

 for ( i in 1:length(unique(wheeldata$Date)) ){
     d <- subset( wheeldata, Date == unique ( wheeldata$Date )[i] )
     plot(d$X, d$Y, xlab = "X", ylab = "Y", main = paste0("Date: ",  unique(d$Date)) )
 }
for(1中的i:长度(唯一(wheeldata$Date))){

d如果你展示了你迄今为止所做的一次实际尝试,并解释了它是如何不起作用的,我可能会想帮助你。@joran,我将编辑我的帖子,以包括我迄今为止的尝试。谢谢。很小的事情,但你犯了一个常见的错误,就是过度使用
哪个
。试着运行
x@shujaa,谢谢你的提示,非常感谢。@shujaa,任何人你能帮我重新编写我的原始代码吗?@Mark Heckmann,非常感谢你提供的代码,它工作得非常漂亮。我正在尝试编辑它,使它使用布局功能在一页上绘制所有三个图形,但还不太清楚。@Mark Heckmann,我刚刚看了第二遍代码。我不太清楚为什么我只得到C100类别作为上述代码中d的输出。为什么它会给出C100类别而不是A1或B10?@John我无法再现您的问题,请详细说明。对我来说,它工作正常。我真的很抱歉打扰您。我刚刚再次执行了代码以确定。我对
d@John的输出for循环的要点是
d
过多每次写入一次,对于
x_1
的每个唯一值写入一次。由于
C100
是最后一个值,当for循环完成时
d
将处于其最终状态。@Martin Bel,非常感谢您提供了有用的参考和代码,我将花时间通读它们。太棒了!这可能是最好的答案我曾经收到过这个论坛的来信。现在我对循环有了更好的理解。谢谢shujaa。
for (i in unique(A$x_1)) {   # this line is good
    plot(A[A$x_1==A$x_1[i], ], aspect = 1)  # still a problem
}
for (i in unique(A$x_1)) {  
    plot(A[A$x_1 == i, ], aspect = 1)  # getting there
}
for (i in unique(A$x_1)) {   
    plot(A[A$x_1==i, "z_2"], A[A$x_1==i, "z_1"])  # z_2 on x, z_1 on y 
}   # Works!!!
for (i in unique(A$x_1)) {   
    plot(A[A$x_1==i, "z_2"], A[A$x_1==i, "z_1"],
         xlim = range(A$z_2), ylim = range(A$z_1), # base the axes on full data range
         main = paste("Plot of", i))  # Give each a title
}
for (i in A$x_1)
 for ( i in 1:length(unique(wheeldata$Date)) ){
     d <- subset( wheeldata, Date == unique ( wheeldata$Date )[i] )
     plot(d$X, d$Y, xlab = "X", ylab = "Y", main = paste0("Date: ",  unique(d$Date)) )
 }