-1

我目前正在使用 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 数据?

4

4 回答 4

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

在此处输入图像描述

于 2013-07-28T19:36:21.607 回答
1

另一个变体 using matplot,假设df在本文末尾使用 。我将其中一年更改19971993仅显示 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)
于 2013-07-29T05:37:07.150 回答
1

这感觉有点骇人听闻,但适用于您的示例数据:

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

在此处输入图像描述

于 2013-07-28T19:37:03.940 回答
0

除了@Arun 的回答,我建议如果您想删除所有条目为 0 的行,您可以使用类似

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

df你的data.frame在哪里。这将摆脱所有元素为 0 的所有行,您可以根据需要绘制其余行。

于 2013-07-28T19:39:41.083 回答