使用ggplot绘制带有NA值的折线图

13

我在使用ggplot进行绘图时遇到了麻烦,想要将两个不完整的时间序列绘制在同一张图上,其中y轴数据在x轴(年份)上的取值不相同,因此某些年份存在NAs:

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

enter image description here

我该如何解决这个问题?

3个回答

13

我更倾向于将其重塑为长格式。这样你只需要调用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()函数调用,以便除了曲线外,还清楚地显示实际数值和缺失数值。使用长格式的另一个优点是,每个附加几何图形只需要1个函数调用,而不是每个数据系列都需要一个。

在此输入图片描述


谢谢,我已经尝试了 melt 但错过了 na.omit。我该如何为每条线路更改线型? - user2568648
2
与上面更改颜色的方式相同。在 aes 调用中使用 linetype=variable,然后(可选)使用 scale_linetype_manual 如果您想指定线型。 - arvi1000

6
您可以使用 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))

进入图像描述

编辑

使用含有na.omit的2个不同数据框:

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

enter image description here


好的,但为什么1947年之前的数据没有被绘制出来呢? - user2568648
1
na.omit会删除带有NA的行。否则,您不能将它们放在同一个数据框中。 - LyzandeR
好的,但是是否可以使用ggplot绘制多个数据框? - user2568648

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接