【问题标题】:Plotting dataframes in the same ggplot with for-loop in a function在函数中使用for循环在同一个ggplot中绘制数据帧
【发布时间】:2016-07-11 20:43:19
【问题描述】:

我有一堆数据框,我想在同一个 ggplot 上绘制每个数据框的 2 列。我已经有另一个函数的绘图,用蓝色和红色着色,我希望将新函数添加到其中。尽管我尝试的方式在控制台上有效,但我无法保存该函数,调用它并让它工作。我得到的错误是:

Discrete value supplied to continuous scale.

因此,数据帧在我的环境中,并命名为 BEFMORN1 到 BEFMORN9。初始图是 test_plot。

给我 test_plot 作品的第一部分。

test_plot<-ggplot()+geom_point(data=yy4, aes(x=Time, y=Dist), colour="red")+geom_point(data=zz4, aes(x=Time, y=Dist), colour="blue")
test_plot<-test_plot+scale_x_continuous(name="Time (Seconds from the beginning)")
test_plot<-test_plot+scale_y_continuous(name="Distance (Metres from the beginning)")

第二部分是新功能

plot_all_runs<-function(r,test_plot) {
for (i in 1:(length(r[[1]]))) {
z<-as.data.frame(mget(ls(pattern=paste0("BEFMORN",i))))
test_plot2<-test_plot+geom_point(data=z, aes_string(x=names(z)[12], y=names(z)[17]))
}print(test_plot2)
}

r 是 6 个不同数据帧列表的列表,因此 BEFMORN 来自 r[[1]]。 BEFNOON 将来自 r[[2]] 等。所以我的计划是在 paste0 中有 6 个具有不同参数的相同函数。

我正在使用aes_string(x=names(z)[12],因为数据框 z 在每次迭代中都有不同的列名。

有人明白我为什么会出错吗?我玩过这些比例(从最初的情节中删除它们或在下一个情节中再次添加它们)但没有任何改进。

编辑: 要绘制的所有列都已转换为数字。其他是因数和整数。

示例

BEFMORN1<-data.frame(BEFMORN1.Time=seq(0:10, 0.5), BEFMORN1.Dist=1:20)
BEFMORN2<-data.frame(BEFMORN2.Time=seq(0:13, 0.5), BEFMORN2.Dist=c(1:8,8,8,9,10,13,13,13,13.5,14,14,14 14:20))
yy4<-data.frame(Time=seq(0:10, 0.5). Dist=c(1:8,8,8,9,10,13,14:20))
ZZ4<-data.frame(Time=seq(0:12, 0.5). Dist=c(1:8,8,8,9,9.5,10,10.5,12,12.5,13,14:20))

test_plot<-ggplot()+geom_point(data=yy4, aes(x=Time, y=Dist), colour="red")+geom_point(data=zz4, aes(x=Time, y=Dist), colour="blue")

plot_all_runs<-function(test_plot) {
for (i in 1:9) {
z<-as.data.frame(mget(ls(pattern=paste0("BEFMORN",i))))
test_plot2<-test_plot+geom_point(data=z, aes_string(x=names(z)[12], y=names(z)[17]))
}print(test_plot2)
}

【问题讨论】:

  • 错误的原因通常是因为数据是宽格式而不是长格式,并且 ggplot 将它们误解为离散变量。除此之外,如果没有可重现的示例 (stackoverflow.com/questions/5963269/…),很难提供帮助。您想将多条曲线添加到单个图还是打印出多个图?
  • 多条曲线到一个图
  • 在这种情况下,将数据帧合并为一个(不需要循环 - 有很多更好的选择),通过定义曲线的任何变量将数据转换为长格式和颜色。
  • 感谢您的回答!不过,我需要为每个数据帧使用不同的曲线。想象一下 test_plot 已经绘制了它们的平均曲线,现在我还需要绘制初始曲线。如果我合并数据框,我将如何区分不同的数据框?
  • @Nikos 您区分数据集中的任何内容的方式相同:在另一列中使用变量。

标签: r for-loop ggplot2


【解决方案1】:

建议生成长格式@biomiha 和@joran 的示例:

library(ggplot2)

BEFMORN1<-data.frame(Time=seq(0,10, 0.5)
                     , Dist=1:21, Group = "BEFMORN1")
BEFMORN2<-data.frame(Time=seq(0,13, 0.5)
                     , Dist=c(1:8,8,8,9,10,13,13,13,13.5,14,14,14,14:21)
                     , Group = "BEFMORN2")
yy4<-data.frame(Time=seq(0,10, 0.5)
                , Dist=c(1:8,8,8,9,10,13,14:21)
                , Group = "yy4")
zz4<-data.frame(Time=seq(0,12, 0.5)
                , Dist=c(1:8,8,8,9,9.5,10,10.5,12,12.5,13,14:21)
                , Group = "zz4")


allData <-
  rbind(BEFMORN1, BEFMORN2, yy4, zz4)


ggplot(allData
       , aes(x = Time
             , y = Dist
             , col = Group)) +
  geom_point()

请注意,如果您的数据已经存在,添加“组”列可能需要更加小心。但是,一般原理是相同的。如果您愿意,您可以使用任何scale_color_* 函数来更改默认颜色,包括scale_color_manual,如果您想自己设置它们。

【讨论】:

  • 是的,这行得通。它需要在所有子集(我有一个包含 6 个不同数量数据帧列表的列表)和两个 for 循环中为列表的每个列表中的每个数据帧自动生成新变量!感谢大家的帮助! (我的例子太复杂,太具体,在这个线程中没有价值,所以我不会上传它。如果有人想看,我会努力解释。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2021-10-27
  • 2019-07-29
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多