【问题标题】:Line plot with average and shadow for min/max具有最小值/最大值的平均值和阴影的线图
【发布时间】:2014-10-04 08:07:17
【问题描述】:

我在下面为此制作了一个快速示例数据框。基本上我想创建一个线图,平均值为一条线,该线周围的阴影代表值的范围。我意识到我可能必须找到最小/最大行,但不确定如何为行执行此操作,也不知道如何绘制此

TEST <- data.frame(a=c(1,5,7,2), b=c(3,8,2,5), c=c(6,10,2,1))
TEST$mean <- rowMeans(TEST)

任何帮助表示赞赏 - 谢谢

【问题讨论】:

    标签: r line-plot


    【解决方案1】:

    使用基本 R 也可能很容易完成,但这里有一个 ggplot 方法

    添加MinMax 以及x 轴的一些索引

    TEST <- transform(TEST, Min = pmin(a,b,c), Max = pmax(a,b,c), indx = seq_len(dim(TEST)[1]))
    

    绘图,使用geom_ribbon

    library(ggplot2)
    ggplot(TEST) +
      geom_line(aes(indx, mean), group = 1) +
      geom_ribbon(aes(x = indx, ymax = Max, ymin = Min), alpha = 0.6, fill = "skyblue")
    

    【讨论】:

      【解决方案2】:

      只是添加另一个选项,这是一个仅使用基本 R 的可能解决方案:

      TEST <- data.frame(a=c(1,5,7,2), b=c(3,8,2,5), c=c(6,10,2,1))
      
      # compute mean, min and max of rows
      means <- rowMeans(TEST)
      maxs <- apply(TEST,1,max)
      mins <- apply(TEST,1,min)
      
      # create x-coordinates
      xcoords <- 1:nrow(TEST)
      
      # create an empty plot to make space for everything 
      plot(x=c(min(xcoords),max(xcoords)),y=c(min(mins),max(maxs)),
           type="n", main="Average",xlab="X",ylab="Y")
      
      # add min-max ranges (color is DodgerBlue with 80/255 of opacity, 
      # for rgb values of colors see http://en.wikipedia.org/wiki/Web_colors)
      rangecolor <- rgb(30,144,255,alpha=80,maxColorValue=255)
      polygon(x=c(xcoords,rev(xcoords)),y=c(maxs,rev(means)),col=rangecolor,border=NA)
      polygon(x=c(xcoords,rev(xcoords)),y=c(mins,rev(means)),col=rangecolor,border=NA)
      
      # add average line (black)
      meancolor <- "black"
      lines(x=xcoords,y=means,col=meancolor)
      

      结果:

      为了以后的重用,你也可以把它包装成一个有用的函数:

      plotLineWithRange <- function(x, yVal, yMin, yMax,
                                lineColor="Black", rangeColor="LightBlue",
                                main="", xlab="X", ylab="Y"){
        if(missing(x)){
          x <- 1:length(yVal)
        }
        stopifnot(length(yVal) == length(yMin) && length(yVal) == length(yMax))
      
        plot(x=c(min(x),max(x)),y=c(min(yMin),max(yMax)),type="n", main=main,xlab=xlab,ylab=ylab)
        polygon(x=c(x,rev(x)),y=c(yMax,rev(yVal)),col=rangeColor,border=NA)
        polygon(x=c(x,rev(x)),y=c(yMin,rev(yVal)),col=rangeColor,border=NA)
        lines(x=x,y=yVal,col=lineColor)
      }
      
      
      # usage example:
      plotLineWithRange(yVal=means,yMin=mins,yMax=maxs,main="Average")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 2016-12-29
        相关资源
        最近更新 更多