行数据的线图

时间:2016-05-17 18:23:47

标签: r ggplot2 reshape line-plot

我想制作类似于ggplot教程的简单线条图:

p1 <- ggplot(ChickWeight, aes(x=Time, y=weight, colour=Diet, group=Chick)) +
    geom_line() +
    ggtitle("Growth curve for individual chicks")

[来自cookbook-r.com]

但是,给出的示例有效地组织了数据(一列具有x变量,另一列具有y变量)。

如果我的数据不那么整洁(在我的数据中,每一行代表一个不断变化的数据观察),我还可以使用ggplot吗?我是否必须重新排列初始文件中的数据才能使用ggplot?

例如,如果我的数据是:

Names       1991  1992  1993
Johny         40    50    80
Dana          78    70    90

我怎样才能为Johny的进展创建一个线图? Dana的?

3 个答案:

答案 0 :(得分:3)

在绘制之前,您需要将数据重新整形为长形。使用dplyrtidyr

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

df_clean <- df %>% 
    gather(year, value, num_range('X', 1991:1993)) %>% 
    mutate(year = extract_numeric(year))

df_clean
#   Names year value
# 1 Johny 1991    40
# 2  Dana 1991    78
# 3 Johny 1992    50
# 4  Dana 1992    70
# 5 Johny 1993    80
# 6  Dana 1993    90

ggplot(df_clean, aes(x = year, y = value, colour = Names)) + geom_line()

ggplot with two lines

请注意,你可能还想做一点清洁(x轴看起来有点傻),但这只是抛光。

数据:

df <- structure(list(Names = structure(c(2L, 1L), .Label = c("Dana", 
        "Johny"), class = "factor"), X1991 = c(40L, 78L), X1992 = c(50L, 
        70L), X1993 = c(80L, 90L)), .Names = c("Names", "X1991", "X1992", 
        "X1993"), class = "data.frame", row.names = c(NA, -2L))

答案 1 :(得分:1)

您还可以使用重塑功能,如下所示

df <- data.frame(c("Johny", "Dana"), c(40, 78), c(50, 70), c(80, 90))
names(df) <- c("Names", 1991, 1992, 1993)
df
  Names 1991 1992 1993
1 Johny   40   50   80
2  Dana   78   70   90
new.df <- reshape(data = df, direction = "long", idvar = "Names", varying = list(2:4), v.names = "Value", times = 1991:1993)

p1 <- ggplot(new.df, aes(x = time , y= Value, colour = Names)) + 
           geom_line() +
           scale_x_continuous(breaks = 1991:1993)
p1

enter image description here

答案 2 :(得分:0)

您已经有了几个解决方案,重塑选项可以非常干净地实现您的目标。我将在没有任何特殊R包的情况下添加一种重新格式化数据的方法,这个方法依赖于stack函数。

# Load ggplot2
library(ggplot2)

# Create example data
df <- data.frame(c("Johny", "Dana"), c(40, 78), c(50, 70), c(80, 90))
names(df) <- c("names", 1991, 1992, 1993)

# Create long data
df.long <- data.frame(names=rep(df$names, 3), stack(df[,2:4]))
df.long$ind <- as.numeric(df.long$ind)

# Plot
ggplot(df.long) + geom_line(aes(ind, values, colour=names))