如何将数据框融合成多个因素

时间:2015-01-24 02:36:26

标签: r plot ggplot2 reshape2 melt

我一直试图用ggplot绘制线图。

我的数据看起来像这样:

        I04 F04 I05 F05 I06 F06
CAT     3   12  2   6   6   20
DOG     0   0   0   0   0   0
BIEBER  1   0   0   1   0   0

并且可以找到here

基本上,我们最初在一年中有一定数量的CAT s(或其他生物)(这是I04),最后有一定数量的CAT s年度(F04)。这种情况持续了一段时间。

我可以使用下面的代码简单地绘制这样的东西,并得到这个:

enter image description here

这太棒了,但对我来说不太好用。毕竟,我每年都有这些盯着和结束的库存。所以我有兴趣了解初始值(I04, I05, I06)随时间的变化情况。因此,对于每只动物,我想创建两条不同的线,一条用于初始数量,一条用于最终数量(F01, F05, F06)。在我看来,现在我必须考虑两个因素。

鉴于我的数据设置方式,这确实很难。我不知道如何告诉ggplot所有I前缀年份是一个因素,所有F前缀年份是另一个因素。当数据帧融化时,为时已晚。我不确定如何控制这种情况。

关于如何分离这些价值观或者另一种更好的方法来解决这种情况的任何建议?

这是我的代码:

library(ggplot2)
library(reshape2)

DF <- read.csv("mydata.csv", stringsAsFactors=FALSE)

## cleaning up, converting factors to numeric, etc
text_names <- data.frame(as.character(DF$animals))
names(text_names) <- c("animals")
numeric_cols <- DF[, -c(1)]
numeric_cols <- sapply(numeric_cols, as.numeric)
plot_me <- data.frame(cbind(text_names, numeric_cols))
plot_me$animals <- as.factor(plot_me$animals)
meltedDF <- melt(plot_me)

p <- ggplot()
p <- p + geom_line(aes(seq(1:36), meltedDF$value, group=meltedDF$animals, color=meltedDF$animals))
p

2 个答案:

答案 0 :(得分:0)

使用链接中的原始数据:

nd <- reshape(mydata, idvar = "animals", direction = "long", varying = names(mydata)[-1], sep = "")
ggplot(nd, aes(x = time, y = I, group = animals, colour = animals)) + geom_line() + ggtitle("Development of initial inventories")

enter image description here

ggplot(nd, aes(x = time, y = F, group = animals, colour = animals)) + geom_line() + ggtitle("Development of final inventories")

enter image description here

答案 1 :(得分:0)

我认为从数据分析师的角度来看,以下方法可能会提供更好的洞察力。

对于每只动物,我们在单独的小组中可视化初始和最终数量。此外,每个子图都有自己的y标度,因为不同动物类型的值是根本不同的。像这样,动物类型内和动物类型之间的差异更容易被发现。

鉴于您数据的当前结构,我们不需要两个不同的因素。在gather调用后,indicator列包含I04,F04等数据。我们只需separate其余的第一个字符,即可生成两列type和{ {1}}。我们可以在time调用中使用type作为color的参数。 ggplot为所有动物类型提供统一的x轴。

time

enter image description here

当然,您也可以反过来这样做,即使用一个子图作为初始数量和最终数量,如下所示:

library(tidyr)
library(dplyr)
library(ggplot2)

data %>% gather(indicator, value, -animals) %>% 
  separate(indicator, c('type', 'time'), sep = 1) %>%
  mutate(
    time = as.numeric(time)
    ) %>% ggplot(aes(time, value, color = type)) +
            geom_line() + 
            facet_grid(animals ~ ., scales = "free_y")

enter image description here

但如上所述,我不建议这样做,因为不同动物类型的y比例变化太大。