如何使用ggplot

时间:2016-03-29 16:05:01

标签: r ggplot2

我有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

这里有几个问题:

  • &#34;可变&#34;总是等于dY。我期待的是指数 列表中的数据帧(存储在L1中),甚至是 更好的是,函数名称(i)的结果
  • 曲线使用连续刻度,范围从1到36,而我想要一个离散刻度
  • 最后,使用geom_line()似乎不会单独绘制数据框曲线,而是将不同数据集的点链接在一起

知道如何解决我的问题吗?

2 个答案:

答案 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的列,其中包含包含每个数据框的列表元素的名称。