在ggplot2中显示多个数据框
Displaying multiple data frames in ggplot2
我正在尝试在一个线图中分层放置多个数据帧,x = index
、y = 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 时,你可以处理这种类型的处理。
我正在尝试在一个线图中分层放置多个数据帧,x = index
、y = 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 时,你可以处理这种类型的处理。