我目前正在使用R来创建折线图。我正在使用的数据框看起来类似于:
1989 1990 1991 1992 1993
A -30 -16 0 0 0
B 12 32 7 0 0
C 0 0 0 0 0
D 0 3 -8 -6 6
E 0 0 0 0 -7
每个字母都是一个单独的行,年份在x轴上,然后值是y轴。如果值不等于零,我想只有一条线存在。我用零来绘制点是没有问题的,但是我试图将0改为NA,但这并没有像我预期的那样工作。
我如何绘制图中不存在0的数据?
答案 0 :(得分:3)
这是使用ggplot2
的一种方式。但首先,您必须重塑您的数据。我会使用reshape2
包执行此操作,如下所示:
require(reshape2)
# melt the data.frame.. and I've manually added the row names as separate col
dd <- transform(melt(df), grp = LETTERS[1:5])
# change type and replace 0 with NA
dd$variable <- as.numeric(as.character(dd$variable))
dd$value[dd$value == 0] <- NA
require(ggplot2)
ggplot(data = dd, aes(x=variable, y=value, group=grp, colour=grp)) +
geom_line() + geom_point()
答案 1 :(得分:1)
这感觉有点hackish但适用于您的样本数据:
plot(NA, xlim=c(.5,5.5), ylim=c(min(df)-1,max(df)+1),
xaxt="n", xlab="Year", ylab="Value")
axis(1,1:5,labels=gsub("X","",names(df)))
apply(df,1,function(x) if(sum(!x==0)>0) points((1:ncol(df))[!x==0],x[!x==0],type="b") )
答案 2 :(得分:1)
另一种变体,使用matplot
,假设在本文末尾使用df
。我将其中一年从1997
更改为1993
只是为了表明x轴值被解释为数字而不是等间距因子。
df[df==0] <- NA
matplot(as.numeric(names(df)),t(as.matrix(df)), type="o",pch=19,lty=1,ann=FALSE)
title(xlab="Years",ylab="Values")
,并提供:
使用的数据:
df <- read.table(textConnection("
1989 1990 1991 1992 1997
A -30 -16 0 0 0
B 12 32 7 0 0
C 0 0 0 0 0
D 0 3 -8 -6 6
E 0 0 0 0 -7
"),header=T,check.names=FALSE)
答案 3 :(得分:0)
除了@ Arun的回答,我建议如果你想要删除所有条目为0的行,你可以使用类似
的内容df[sapply(1:nrow(df), function(i) !all(df[i,] == 0)),]
其中df
是您的data.frame。这将消除所有元素为0的所有行,您可以根据需要绘制其余的行。