【问题标题】:Plotting each column of a dataframe as one line using ggplot使用 ggplot 将数据框的每一列绘制为一条线
【发布时间】:2014-11-19 14:20:48
【问题描述】:

整个数据集描述了一个模块(或集群,如果您愿意)。

为了重现示例,数据集可在以下位置获得: https://www.dropbox.com/s/y1905suwnlib510/example_dataset.txt?dl=0

(54kb 文件)

你可以读作:

test_example <- read.table(file='example_dataset.txt')

我想在我的情节中拥有的是this

在图上,x 轴是我的时间点列,y 轴是数据集上的列,最后 3 列除外。然后我使用 facet_wrap() 按 ConditionID 列分组。

这正是我想要的,但我实现这一点的方法是使用以下代码:

plot <- ggplot(dataset, aes(x=Timepoints))
plot <- plot + geom_line(aes(y=dataset[,1],colour = dataset$InModule))
plot <- plot + geom_line(aes(y=dataset[,2],colour = dataset$InModule))
plot <- plot + geom_line(aes(y=dataset[,3],colour = dataset$InModule))
plot <- plot + geom_line(aes(y=dataset[,4],colour = dataset$InModule))
plot <- plot + geom_line(aes(y=dataset[,5],colour = dataset$InModule))
plot <- plot + geom_line(aes(y=dataset[,6],colour = dataset$InModule))
plot <- plot + geom_line(aes(y=dataset[,7],colour = dataset$InModule))
plot <- plot + geom_line(aes(y=dataset[,8],colour = dataset$InModule))
...

如您所见,它不是很自动化。我想过放一个循环,比如

columns <- dim(dataset)[2] - 3
for (i in seq(1:columns))
{
  plot <- plot + geom_line(aes(y=dataset[,i],colour = dataset$InModule))
}
(plot <- plot + facet_wrap(  ~ ConditionID, ncol=6) )

这行不通。 我找到了这个话题 Use for loop to plot multiple lines in single plot with ggplot2 对应于我的问题。 我尝试了使用 melt() 函数给出的解决方案。

问题是当我在我的数据集上使用 melt 时,我丢失了 Timepoints 列的信息以绘制为我的 x 轴。我就是这样做的:

data_melted <- dataset
as.character(data_melted$Timepoints)
dataset_melted <- melt(data_melted)

我尝试使用聚合

aggdata <-aggregate(dataset, by=list(dataset$ConditionID), FUN=length)

现在有了 aggdata,至少我有关于我拥有的每个 ConditionID 有多少个时间点的信息,但我不知道如何从这里开始并将其结合到 ggplot 上。

谁能给我建议一个方法。 我知道我可以使用丑陋的解决方案,即使用 rbind 在循环中创建新数据集(也在该链接中给出),但我不想这样做,因为这听起来效率很低。我想学习正确的方法。

谢谢

【问题讨论】:

  • 将您的数据转换为长格式(使用例如melt)是标准的ggplot 方式我会说。请提供一个独立的最小示例(参见例如here)并展示您使用melt的尝试。
  • 建议您直接在Q中发布示例数据,以便这里的人们可以在提出解决方案之前进行测试。
  • 感谢您的反馈。为了重现性,我现在添加了数据。
  • Dropbox 文件不再可用

标签: r plot ggplot2 facet-wrap


【解决方案1】:

您必须在致电melt.data.frame 时指定id.vars 以保留您需要的所有信息。在对ggplot 的调用中,您需要指定正确的分组变量以获得与以前相同的结果。这是一个可能的解决方案:

melted <- melt(dataset, id.vars=c("Timepoints", "InModule", "ConditionID"))
p <- ggplot(melted, aes(Timepoints, value, color = InModule)) +
  geom_line(aes(group=paste0(variable, InModule)))
p

【讨论】:

  • 谢谢!这解决了我的问题。不过我有点困惑。为什么当我没有指定 id.vars 时,melt 会自动保留我需要的几乎所有列,除了最后一列?这里的标准是什么?是因为它将每一列都识别为数字,然后最终找到了因子列并假设直到该点的所有列都是正确的列?此外,您的方式是说 Timepoints 列作为 id 工作,这是不正确的。它们在某种程度上像其他列一样是值,但只有在按它们所代表的每个条件分组时才有意义
猜你喜欢
  • 1970-01-01
  • 2018-10-28
  • 2017-07-02
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多