Проблемы с добавлением нового цикла в функцию представления данных - PullRequest
0 голосов
/ 06 мая 2018

У меня есть этот рабочий набор данных:

chr<-c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2)
iid<-c("sc1","sc1","sc2","sc2","sc3","sc3","sc4","sc4","sc5","sc5","sc1","sc2","sc3","sc4","sc5","sc6")
pos1<-c(2,34,7,56,12,67,11,34,2,67,23,56,12,11,12,43)
pos2<-c(23,54,12,98,54,79,22,67,43,98,23,54,65,32,54,57)
fam<-c(1,1,1,1,2,2,2,2,3,3,1,2,3,4,5,6)
data<-data.frame( iid,chr,pos1,pos2,fam)

Мое намерение состоит в том, чтобы представить разделы между данными $ pos1 и данными $ pos2 каждого IID. Я использую следующий скрипт для chr:

plot_chr<-function(f,descn,chr){
  a<-f[f$chr==chr,]
  iids_num<-as.character(unique(a$iid))
  nsamps<-length(iids_num)
  xlimi<-c(0,max(a$pos2))
  plot(NULL,xlim=xlimi,ylim=c(0,nsamps),main=descn,xlab="Physical Position",ylab="Subject")
  for (id_no in 1:nsamps) {
    plot_dat<-a[which(a$iid==iids_num[id_no]),]
    if (length(plot_dat$iid) > 0) {
      for (roh_n in 1:length(plot_dat$iid)) {
        x<-c(plot_dat[roh_n,"pos1"],plot_dat[roh_n,"pos2"])
        y<-  c(id_no,id_no)
        lines(x,y,lw=2,lend=2,col="red")
      }
    }
  }
  return(a)
}

Вот результат:

windows()
plot_chr(data,"data",1)

enter image description here

Однако я хочу изменить и добавить новую переменную. В этом точном графике (chr = 1) я хотел бы изменить цвета линий в соответствии с данными фактора $ fam. Например, мне нужна красная линия для iid = sc1 и sc2 (fam = 1), синяя линия для iid = sc3 и sc4 (fam = 2) и зеленая линия для iid = sc5 (fam = 3). Каждый раз, когда я пытаюсь изменить скрипт, у меня появляются ошибки.

1 Ответ

0 голосов
/ 06 мая 2018

Вы можете определить цветовое отображение, используя именованный вектор:

plot_chr<-function(f,descn,chr,colorsByFam){
  a<-f[f$chr==chr,]
  iids_num<-as.character(unique(a$iid))
  nsamps<-length(iids_num)
  xlimi<-c(0,max(a$pos2))
  plot(NULL,xlim=xlimi,ylim=c(0,nsamps),main=descn,xlab="Physical Position",ylab="Subject")
  for (id_no in 1:nsamps) {
    plot_dat<-a[which(a$iid==iids_num[id_no]),]
    if (length(plot_dat$iid) > 0) {
      for (roh_n in 1:length(plot_dat$iid)) {
        x<-c(plot_dat[roh_n,"pos1"],plot_dat[roh_n,"pos2"])
        y<-  c(id_no,id_no)
        # here we're getting the color corresponding to fam
        # note that as.character is necessary, otherwise it will use plot_dat$fam
        # as index of colorsByFam vector and not as a name
        color <- colorsByFam[as.character(plot_dat$fam)] 
        lines(x,y,lw=2,lend=2,col=color)
      }
    }
  }
  return(a)
}

colorsByFam <- c('1'='red','2'='blue','3'='green')
# or equivalently : 
# colorsByFam <- c('red','blue','green')
# names(colorsByFam) <- c(1,2,3)
plot_chr(data,"data",1,colorsByFam)

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...