在行中设置重复()

时间:2013-04-17 13:03:05

标签: r plot lines repeat

我正在尝试创建一个'前后'线图,显示手术前后血液检查的结果。我有307对数据,因此需要获取线功能,为从术前和术后数据(一列:一名患者)创建的数据矩阵中的307列中的每一列绘制一条线。所以我尝试了这个:

ylabel<-"Platelet count (millions/ml)"
preoptpk<-c(100,101,102,103,104,105)
postoptpk<-c(106,107,108,109,110,111) 
preoptpk<-t(matrix(preoptpk))
postoptpk<-t(matrix(postoptpk)) 
preoptpk 
postoptpk
beforeandafterdata<-rbind(preoptpk, postoptpk) 
beforeandafterdata
ylimits<-c(0.8*min(beforeandafterdata,na.rm=TRUE),1.15*max(beforeandafterdata, na.rm=TRUE)) 
ylimits
plot(beforeandafterdata[,1], type = "l", col = "black", xlim = c(0.9, 2.1), 
           ylim = ylimits, ann = FALSE, axes = FALSE)
title(ylab=ylabel, cex.lab=1.4)
axis(1,at=1:2,lab=c("Preop.","Postop."),cex.axis=1.5)
axis(2,labels=TRUE) 
x<-c(1*2:6) 
x
lines(beforeandafterdata[,x],type="l",col="black", 
           xlim=c(0.9,2.1),ylim=ylimits,ann=FALSE)

..什么也没发生。

我不明白为什么我不能使用x&lt; -c(1 * 2:307),因为当我手动将x定义为2然后3然后4然后5然后6它工作正常:

x <- 2 x
 lines(beforeandafterdata[,x],type="l",col="black",xlim=c(0.9,2.1),ylim=ylimits,ann=FALSE)
x <-3 x
lines(beforeandafterdata[,x],type="l",col="black",xlim=c(0.9,2.1),ylim=ylimits,ann=FALSE)
x <-4 x
lines(beforeandafterdata[,x],type="l",col="black",xlim=c(0.9,2.1),ylim=ylimits,ann=FALSE)
x<-5 x
lines(beforeandafterdata[,x],type="l",col="black",xlim=c(0.9,2.1),ylim=ylimits,ann=FALSE)
x<-6 x
lines(beforeandafterdata[,x],type="l",col="black",xlim=c(0.9,2.1),ylim=ylimits,ann=FALSE)
x<-c(1*2:6)

任何帮助我如何才能让它发挥作用?由于我有几个变量并且手动为每个变量绘制307行将耗费大量时间。谢谢你的回复。

2 个答案:

答案 0 :(得分:2)

要努力贴近您的示例,您需要在xy.coords中使用lines

plot(beforeandafterdata[,1],type="l",col="black",xlim=c(0.9,2.1),ylim=ylimits,
     ann=FALSE,axes=FALSE) 
title(ylab=ylabel, cex.lab=1.4) 
axis(1,at=1:2,lab=c("Preop.","Postop."),cex.axis=1.5)
axis(2,labels=TRUE) 
x<-c(1*2:6) 
x 
lapply(x, function(x){
lines(xy.coords(x=c(1, 2), y=c(beforeandafterdata[,x])), type="l", col="black", 
      xlim=c(0.9,2.1),ylim=ylimits,ann=FALSE)
})

需要lapply来阻止一行加入下一行

答案 1 :(得分:1)

您可以使用for loop执行此操作。 e.g:

for (x in 2:6) {
  lines(beforendafterdata[,x], ...)
}

或者您可以使用reshape2ggplot2个包。首先melt将您的数据转换为ggplot2喜欢的长格式:

library(reshape2)
beforeandafter_melted <- melt(beforeandafterdata)

然后去掉。您不需要color参数,但group对于强制绘制单个行非常重要。

library(ggplot2)
ggplot(beforeandafter_melted, aes(x=Var1, y=value, color=factor(Var2), group=Var2)) + 
  geom_line()

Var1是行(1或2),Var2是初始矩阵beforeandafterdata中的列(1到6)。

另外,为什么要写x <- c(1*2:307)?这与2:307没有什么不同(除非你试图强制进行数字转换,但这不是解决问题的方法)。

all.equal(c(1*2:307), 2:307)
# [1] TRUE