我有36个不同的数据框,包含dX和dY变量。我已将它们存储在一个列表中,并希望将它们全部显示在x = dX和y = dY的同一图表上。
36个数据帧不共享相同的dX值。它们大致覆盖相同的范围但不具有完全相同的值,因此使用合并会产生大量的NA值。但行数相同。
我尝试了一些丑陋的东西,几乎可以工作:
g <- ggplot()
for (i in 1:36) {
g <- g + geom_line(data = df.list[[i]], aes(dX, dY, colour = i))
}
print(g)
这会正确显示曲线,但不会应用颜色(并且我没有合适的图例)。好的,图例中有36行可能不实用。在这种情况下,我会减少绘制的行数。
第二种方法:我尝试按如下方式熔化数据帧。
df <- melt(df.list, id.vars = "dX")
ggplot(df, aes(x = dX, y = value, colour = L1)) + geom_line()
但这会创建一个包含列的4变量数据框:dX,变量(总是等于dY),值(这里是dY值)和L1,它包含列表中数据框的索引。
以下是融化数据框的第一行:
dX variable value L1
1 4.952296 dY 6.211485e-05 1
2 6.766889 dY 7.661041e-05 1
3 8.581481 dY 9.550221e-05 1
4 10.396074 dY 1.192053e-04 1
5 12.210666 dY 1.498834e-04 1
6 14.025259 dY 1.883612e-04 1
7 15.839851 dY 2.365646e-04 1
8 17.654444 dY 2.956796e-04 1
9 19.469036 dY 3.662252e-04 1
10 21.283629 dY 4.470143e-04 1
这里有几个问题:
知道如何解决我的问题吗?
答案 0 :(得分:7)
我会将data.frame合并到一个大型data.frame中,添加一个id列,然后用ggplot绘图。有很多方法可以做到这一点:
newDF <- do.call(rbind, list.df)
newDF$id <- factor(rep(1:length(df.list), each = sapply(df.list, nrow)))
g <- geom(newDF, aes(x = dX, y = dY, colour = id)
g <- g + geom_line()
print(g)
答案 1 :(得分:3)
似乎最直接的选择是创建单个数据框(如其中一个评论者所建议的)并使用源数据框的索引来表示colour
美学:
library(dplyr) # For bind_rows() function
ggplot(bind_rows(df.list, .id="id"), aes(dX, dY, colour=id)) +
geom_line()
在上面的代码中,.id="id"
会导致bind_rows
包含一个名为id
的列,其中包含包含每个数据框的列表元素的名称。