0

我一直在尝试用 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

并且可以在这里找到。

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

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

在此处输入图像描述

这太棒了,但对我来说效果不佳。毕竟,我每年都有这些盯着和结束的库存。所以我有兴趣了解初始值 ( 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
4

2 回答 2

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")

在此处输入图像描述

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

在此处输入图像描述

于 2015-01-24T03:38:38.187 回答
0

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

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

鉴于您的数据的当前结构,我们不需要两个不同的因素。gather调用后,该indicator列包含 I04、F04 等数据。我们只需separate要从其余的第一个字符得到两列typetime. 我们可以在调用中type用作参数。为所有动物类型提供统一的 x 轴。colorggplottime

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")

在此处输入图像描述

当然,您也可以反过来做,即使用子图来表示初始量和最终量,如下所示:

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

在此处输入图像描述

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

于 2015-01-24T11:38:31.513 回答