【问题标题】:Displaying multiple data frames in ggplot2在 ggplot2 中显示多个数据框
【发布时间】:2016-12-02 04:34:40
【问题描述】:

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

      Values
2306  0.000000
2307  1.004711

由于数据框的大小不同,我还尝试通过将数据集转换为百分比(索引/值总数)*100 来调整数据集的大小,我应该将其放在绘图代码中还是我应该在绘图之前更好地转换数据集吗?

希望 StackOverflow 的主脑可以帮助 R 新手

【问题讨论】:

标签: r plot dataframe ggplot2 formula


【解决方案1】:

不需要蜂巢思维:

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)

【讨论】:

  • 谢谢,但我正在寻找单线图
  • @Mesa 当然。如果你想要一个线图,你只需使用geom_line 而不是geom_point。抱歉,问题并不清楚。
【解决方案2】:

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

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 时,您可以处理这种类型的处理。

【讨论】:

  • 我已经从文件中读取了数据,目前是data.frame格式。我以前从未列过清单 - 我保证我更擅长 java - 我的数据帧存储在变量 sign1、...、sign8 我不确定在哪里/如何插入我的数据
猜你喜欢
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2020-10-13
相关资源
最近更新 更多