在ggplot2中显示多个数据框

Displaying multiple data frames in ggplot2

我正在尝试在一个线图中分层放置多个数据帧,x = indexy = values。我使用的 8 data.frames 采用这种格式(索引和值)并且有几百行长:

      Values
2306  0.000000
2307  1.004711

因为数据框的大小不尽相同,我还试图通过将它们转换为百分比(index/total 值的数量)*100 来调整数据集的大小,我应该把它放在绘图代码还是我应该在绘图前更好地转换数据集?

希望Whosebug的hivemind能帮到R新手

不需要蜂群思维:

d0 <- data.frame(index = 1:100, values = rnorm(100))
d1 <- data.frame(index = 1:200, values = rnorm(200))
d2 <- data.frame(index = 1:100, values = rnorm(100))
d3 <- data.frame(index = 1:100, values = rnorm(100))
d4 <- data.frame(index = 1:100, values = rnorm(100))
d5 <- data.frame(index = 1:500, values = rnorm(500))
d6 <- data.frame(index = 1:100, values = rnorm(100))
d7 <- data.frame(index = 1:100, values = rnorm(100))

require(ggplot2)
p0 <- ggplot(d0, aes(x=index, y=values)) + geom_point(alpha=.3)
p1 <- ggplot(d1, aes(x=index, y=values)) + geom_point(alpha=.3)
p2 <- ggplot(d2, aes(x=index, y=values)) + geom_point(alpha=.3)
p3 <- ggplot(d3, aes(x=index, y=values)) + geom_point(alpha=.3)
p4 <- ggplot(d4, aes(x=index, y=values)) + geom_point(alpha=.3)
p5 <- ggplot(d5, aes(x=index, y=values)) + geom_point(alpha=.3)
p6 <- ggplot(d6, aes(x=index, y=values)) + geom_point(alpha=.3)
p7 <- ggplot(d7, aes(x=index, y=values)) + geom_point(alpha=.3)

require(Rmisc)
multiplot(p0, p1, p2, p3, p4, p5, p6, p7, cols=2)

如果您希望将它们全部放在一个图中,那么最简单的方法是先 "stack" 数据框并包含一列来标识数据来自哪个原始数据框。

library(dplyr)
library(ggplot2)

首先创建假数据。下面的代码创建了一个包含八个数据框的列表。我们假设这是我们读入数据后的起点。如果您从单独的文件(例如 csv 文件)读取数据框,只需将它们全部读入一个列表,然后使用 bind_rows 堆叠它们:

# Fake data
set.seed(954)
df = lapply(paste0("d",0:7), function(x) {
  n=sample(seq(100,500,100),1)
  data.frame(source=x, index=1:n, values=cumsum(rnorm(n)))
})

# Stack the eight data frames into a single data frame
df = bind_rows(df)

使用 ggplot 绘图。我们使用 source(原始数据框的名称)作为 colour 审美:

ggplot(df, aes(index, values, colour=source)) +
  geom_line() +
  theme_bw()

或者,如果您想规范化 index 以跨越每个数据帧的相同范围:

ggplot(df %>% group_by(source) %>%
         mutate(index = index/max(index)), 
       aes(index, values, colour=source)) +
  geom_line() +
  theme_bw()

更新:为了回应您的评论,如果您已经有了数据框,您可以这样做以获得单个数据框:

df=lapply(paste0("sign",1:8), function(x) {
  data.frame(source=x, get(x))
})

df=bind_rows(df)

但是你一定已经在某个时候将数据读入 R,当你将数据文件读入 R 时,你可以处理这种类型的处理。