具有 NA 值的 ggplot 折线图
ggplot line graph with NA values
我在使用 ggplot 尝试在同一图表上绘制 2 个不完整的时间序列时遇到问题,其中 y 数据在 x 轴(年)上没有相同的值 - 因此某些年份存在 NA :
test<-structure(list(YEAR = c(1937, 1938, 1942, 1943, 1947, 1948, 1952,
1953, 1957, 1958, 1962, 1963, 1967, 1968, 1972, 1973, 1977, 1978,
1982, 1983, 1986.5, 1987, 1993.5), A1 = c(NA, 24, NA, 32, 32,
NA, 34, NA, NA, 18, 12, NA, 10, NA, 11, NA, 15, NA, 24, NA, NA,
25, 26), A2 = c(40, NA, 38, NA, 25, NA, 26, NA, 20, NA, 17,
17, 17, NA, 16, 18, 21, 18, 17, 25, NA, NA, 26)), .Names = c("YEAR", "A1",
"A2"), row.names = c(NA, -23L), class = "data.frame")
我试过的以下代码输出了一个杂乱无章的混乱:
ggplot(test, aes(x=YEAR)) +
geom_line(aes(y = A1), size=0.43, colour="red") +
geom_line(aes(y = A2), size=0.43, colour="green") +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))
我该如何解决这个问题?
您可以使用 na.omit
:
删除它们
library(ggplot2)
#use na.omit below
ggplot(na.omit(test), aes(x=YEAR)) +
geom_line(aes(y = A1), size=0.43, colour="red") +
geom_line(aes(y = A2), size=0.43, colour="green") +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))
编辑
使用 2 个单独的 data.frames 和 na.omit
:
#test1 and test2 need to have the same column names
test1 <- test[1:2]
test2 <- tes[c(1,3)]
colnames(test2) <- c('YEAR','A1')
library(ggplot2)
ggplot(NULL, aes(y = A1, x = YEAR)) +
geom_line(data = na.omit(test1), size=0.43, colour="red") +
geom_line(data = na.omit(test2), size=0.43, colour="green") +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))
我的首选解决方案是将其重塑为长格式。那么你只需要 1 geom_line
次调用。特别是如果你有很多系列,那就更整洁了。结果与 LyzandeR 的第二张图表相同。
library(ggplot2)
library(reshape2)
test2 <- melt(test, id.var='YEAR')
test2 <- na.omit(test2)
ggplot(test2, aes(x=YEAR, y=value, color=variable)) +
geom_line() +
scale_color_manual(values=c('red', 'green')) +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))
您可以考虑在该行之外添加一个 geom_point()
调用,这样可以清楚哪些点是真实值,哪些点缺失。长格式的另一个优点是额外的 geom 每个只需要调用 1 次,而不是每个系列调用 1 次。
您可以通过对数据框进行子集化来删除它们:
ggplot(test, aes(x=YEAR)) +
geom_line(data=subset(test, !is.na(A1)),aes(y = A1), size=0.43, colour="red") +
geom_line(data=subset(test, !is.na(A2)),aes(y = A2), size=0.43, colour="green") +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))
我在使用 ggplot 尝试在同一图表上绘制 2 个不完整的时间序列时遇到问题,其中 y 数据在 x 轴(年)上没有相同的值 - 因此某些年份存在 NA :
test<-structure(list(YEAR = c(1937, 1938, 1942, 1943, 1947, 1948, 1952,
1953, 1957, 1958, 1962, 1963, 1967, 1968, 1972, 1973, 1977, 1978,
1982, 1983, 1986.5, 1987, 1993.5), A1 = c(NA, 24, NA, 32, 32,
NA, 34, NA, NA, 18, 12, NA, 10, NA, 11, NA, 15, NA, 24, NA, NA,
25, 26), A2 = c(40, NA, 38, NA, 25, NA, 26, NA, 20, NA, 17,
17, 17, NA, 16, 18, 21, 18, 17, 25, NA, NA, 26)), .Names = c("YEAR", "A1",
"A2"), row.names = c(NA, -23L), class = "data.frame")
我试过的以下代码输出了一个杂乱无章的混乱:
ggplot(test, aes(x=YEAR)) +
geom_line(aes(y = A1), size=0.43, colour="red") +
geom_line(aes(y = A2), size=0.43, colour="green") +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))
我该如何解决这个问题?
您可以使用 na.omit
:
library(ggplot2)
#use na.omit below
ggplot(na.omit(test), aes(x=YEAR)) +
geom_line(aes(y = A1), size=0.43, colour="red") +
geom_line(aes(y = A2), size=0.43, colour="green") +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))
编辑
使用 2 个单独的 data.frames 和 na.omit
:
#test1 and test2 need to have the same column names
test1 <- test[1:2]
test2 <- tes[c(1,3)]
colnames(test2) <- c('YEAR','A1')
library(ggplot2)
ggplot(NULL, aes(y = A1, x = YEAR)) +
geom_line(data = na.omit(test1), size=0.43, colour="red") +
geom_line(data = na.omit(test2), size=0.43, colour="green") +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))
我的首选解决方案是将其重塑为长格式。那么你只需要 1 geom_line
次调用。特别是如果你有很多系列,那就更整洁了。结果与 LyzandeR 的第二张图表相同。
library(ggplot2)
library(reshape2)
test2 <- melt(test, id.var='YEAR')
test2 <- na.omit(test2)
ggplot(test2, aes(x=YEAR, y=value, color=variable)) +
geom_line() +
scale_color_manual(values=c('red', 'green')) +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))
您可以考虑在该行之外添加一个 geom_point()
调用,这样可以清楚哪些点是真实值,哪些点缺失。长格式的另一个优点是额外的 geom 每个只需要调用 1 次,而不是每个系列调用 1 次。
您可以通过对数据框进行子集化来删除它们:
ggplot(test, aes(x=YEAR)) +
geom_line(data=subset(test, !is.na(A1)),aes(y = A1), size=0.43, colour="red") +
geom_line(data=subset(test, !is.na(A2)),aes(y = A2), size=0.43, colour="green") +
xlab("Year") + ylab("Percent") +
scale_x_continuous(limits=c(1935, 1995), breaks = seq(1935, 1995, 5),
expand = c(0, 0)) +
scale_y_continuous(limits=c(0,50), breaks=seq(0, 50, 10), expand = c(0, 0))