R:使用segment函数绘制堆叠线的地图

时间:2012-03-07 19:07:17

标签: r plot segments

我编写了一个函数,它沿轴绘制多条线,将它们重叠在一起。下面是代码,示例表及其生成的图像。

情节大部分都是我正在寻找的东西,但有些东西(按重要性排序):

  1. 绘制片段是一个非常缓慢的过程:每0.5秒约1个片段。考虑到它们只是线条,我期待更快。我不知道原因。我知道R中的显式循环可能很慢,所以可能是这样,或者我应该以某种方式在屏幕外绘图,然后将绘图推送到屏幕之后?找到一种绘制这种地图的时间效率方法非常重要,因为我的表格很容易就可以长达数万行。

  2. 无论Y位置的数量如何,我都找不到将y位置之间的间隙指定为固定距离的方法。在极端情况下,仅绘制两个线段会产生一个区域,这些区段彼此之间的距离非常远。

  3. 任何人都可以帮助我解决这些问题(或者其他任何我可以做得更好的事情)吗?

    (在此代码中读取==段)

    功能:

    viewReads <- function(reads){
        # sort by start
        sorted <- reads[order(reads$start),];
    
        #---
        # In the first iteration we work out the y-axis
        # positions that segments should be plotted on
        # segments should be plotted on the next availible
        # y position without merging with another segment
        #---
        yread <- c(); #keeps track of the x space that is used up by segments 
    
        # get x axis limits
        minstart <- min(sorted$start);
        maxend <- max(sorted$end);
    
        # initialise yread
        yread[1] <- minstart - 1;
        ypos <- c(); #holds the y pos of the ith segment
    
        # for each read
        for (r in 1:nrow(sorted)){
            read <- sorted[r,];
            start <- read$start;
            placed <- FALSE;
    
            # iterate through yread to find the next availible
            # y pos at this x pos (start)
            y <- 1;
            while(!placed){
    
                if(yread[y] < start){
                    ypos[r] <- y;
                    yread[y] <- read$end;
                    placed <- TRUE;
                } 
    
                # current y pos is used by another segment, increment
                y <- y + 1;
                # initialize another y pos if we're at the end of the list
                if(y > length(yread)){
                    yread[y] <- minstart-1;
                }
            }
        } 
    
        # find the maximum y pos that is used to size up the plot
        maxy <- length(yread);
        sorted$ypos <- ypos;
    
        # Now we have all the information, start the plot
        plot.new();
        plot.window(xlim=c(minstart, maxend+((maxend-minstart)/10)), ylim=c(1,maxy));
        axis(3);
    
        #---
        # This second iteration plots the segments using the found y pos and 
        # the start and end values
        #---
        for (r in 1:nrow(sorted)){
            read <- sorted[r,];
            # colour dependent on strand type
            if(read$strand == '+'){
                color = 'blue'
             }else{
                color = 'red'
             } 
            #plot this segment!
            segments(read$start, maxy-read$ypos, read$end, maxy-read$ypos, col=color);
        }
    }
    

    示例代码:

    start   end strand
    86  115 +
    87  115 +
    91  116 +
    88  117 +
    91  117 +
    98  125 -
    104 131 +
    104 131 +
    106 132 -
    104 134 +
    104 134 +
    104 134 +
    106 134 +
    106 134 +
    106 134 +
    106 134 +
    106 134 +
    106 135 +
    106 135 +
    106 135 +
    106 135 +
    106 135 +
    106 135 +
    106 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    108 135 +
    109 135 +
    116 135 -
    106 136 +
    106 136 +
    106 136 +
    108 136 +
    108 136 +
    108 136 +
    108 136 +
    108 136 +
    108 136 +
    108 136 +
    108 136 +
    108 136 +
    108 137 +
    108 137 +
    109 137 -
    108 138 +
    108 138 +
    108 138 +
    108 138 +
    112 138 +
    112 139 +
    119 141 +
    116 143 +
    121 145 +
    127 145 -
    119 146 +
    121 148 +
    142 169 -
    142 169 -
    160 185 -
    162 185 -
    165 185 -
    

    结果:

    My graph

1 个答案:

答案 0 :(得分:2)

抱歉,我没有时间处理一个可行的示例,但segments()(以及其他功能,如polygons()points()等可以将其参数作为向量,这样你就可以在一个函数调用中完成所有绘图。通常在绘图之前准备参数(如果需要,可以apply()或循环),这比重复调用这些绘图函数要快。在这篇文章中:Plotting a rather complex chart using R and axis break()提供了这种方法的完整示例。您肯定能够将此应用于您的情况。祝您好运!(并感谢您告诉我回答)