删除R中直线图中某个值的点

删除R中直线图中某个值的点,r,plot,line,R,Plot,Line,我目前正在使用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 每个字母都是一

我目前正在使用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的数据,使其不出现在图形中?

这里有一种方法使用
ggplot2
。但首先,您必须重塑数据。我将使用
reformae2
包执行此操作,如下所示:

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()
require(重塑2)
#融化数据帧。。我已经手动将行名称添加为单独的列

dd这感觉有点粗糙,但适用于您的示例数据:

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

除了@Arun的答案之外,我建议如果您想删除所有条目都为0的行,您可以使用

df[sapply(1:nrow(df), function(i) !all(df[i,] == 0)),]

其中,
df
是您的data.frame。这将删除所有元素都为0的所有行,您可以根据需要绘制其余行。

另一种变体,使用
matplot
,假设在本文末尾使用
df
。我将其中一年从
1993
改为
1997
,只是为了表明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[df==0]什么是“没有按预期工作”的真正含义?你想要分段而不是“直线”吗?当我将0s改为NA时,图形没有按应有的方式绘制。x轴变为1,y轴消失,线条不再正确绘制。@Judy,如果你只是粘贴代码,就可以省去很多问题。它将帮助人们从你遇到问题的地方开始,而不是从零开始。“它应该有的”实际上是什么意思?你需要说你想要什么,而不是你不想要什么。但问题并没有明确说明当行的所有值都为0时不打印。它只是说“不要绘制0”(afaiu)@Arun,我想我理解为“如果值不等于零,我希望有一条线出现”,就像“如果行的所有点都为零,不要绘制线”。op当然可以更清楚地说明他的意图,但感谢你指出其中的模糊性:)
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)