我想制作类似于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的?
答案 0 :(得分:3)
在绘制之前,您需要将数据重新整形为长形。使用dplyr
和tidyr
:
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()
请注意,你可能还想做一点清洁(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
答案 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))