1

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

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

[来自食谱-r.com ]

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

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

例如,如果我的数据显示为:

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

我怎样才能为约翰尼的进步创建一个线图?达娜的?

4

3 回答 3

4

在绘图之前,您需要将数据重塑为长格式。使用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

请注意,您可能还需要进行一些清洁(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))
于 2016-05-17T18:42:47.977 回答
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

在此处输入图像描述

于 2016-05-17T19:32:47.990 回答
0

您在这里已经有了几个解决方案,并且 reshape 选项非常干净地实现了您的目标。我将添加另一种方法来重新格式化您的数据,而无需任何特殊的 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))

于 2016-05-17T23:13:35.030 回答