1

我正在尝试创建一个“前后”折线图,显示手术前后的血液检查结果。我有 307 对数据,因此需要获取 lines 函数来为从术前和术后数据创建的数据矩阵中的 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<-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 条线会很耗时。谢谢您的回复。

4

2 回答 2

2

试图靠近您的示例,您需要使用xy.coordswithin 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 以防止一条线连接到下一条线

于 2013-04-17T13:27:33.253 回答
1

您可以使用 afor loop来执行此操作。例如:

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列(1 到 6)在哪里beforeandafterdata

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

all.equal(c(1*2:307), 2:307)
# [1] TRUE
于 2013-04-17T13:21:06.953 回答