【问题标题】:R: Adding qualitative data with non numerical values to a plot loopR:将具有非数值的定性数据添加到绘图循环中
【发布时间】:2014-09-05 16:10:27
【问题描述】:

我有一个带有“正常数据”的样本data.frame,在这种情况下会按组生成 2 个图(这里的组由ID 分割)。您可以在下面找到我的代码:

# Normal Dataframe
xy <- data.frame(NAME=c("NAME1", "NAME1","NAME1","NAME1","NAME1", "NAME1","NAME1","NAME1","NAME2","NAME2","NAME2","NAME2","NAME2","NAME2","NAME2","NAME2","NAME2","NAME2"),ID=c(47,47,47,47,47,47,47,47,259,259,259,259,259,259,259,259,259,259),YEAR=c(1959,1960,1960,1961,1961,1963,1963,1965,2004,2007,2007,2009,2009,2010,2010,2011,2011,2014),VALUE=c(0,-6,-6,-16,-16,-31,-31,-54,0,-9,-9,-24,-24,-69,-69,-92,-92,-132))
xy$ID <-paste(xy$ID, ".png", sep = "") # Add .png Fileextension
ind <- split(x = xy,f = xy[,'ID']) # index split by ID

### PLOT
for(i in 1:length(ind)){
  png(names(ind[i]), width=3358, height=2329, res=300)
  par(mar=c(6,8,6,5))
  plot(ind[[i]][,c('YEAR','VALUE')],
       type='n',
       main=ind[[i]][1,'NAME'],
       xlab="Time [Years]", 
       ylab="Length change [m]")  
  # plot axis
  axis(1, at = seq(1000,2030,10), cex.axis=1, labels=FALSE, tcl=-0.3) 
  # plot points and lines
  points(ind[[i]][,c('YEAR','VALUE')], type="l", lwd=2)
  points(ind[[i]][,c('YEAR','VALUE')], type="p", lwd=1, cex=1,   pch=21, bg='white')  
  dev.off() 
}

这一切都很好,但我也有我想在图中显示的定性数据。 (示例)data.frame 如下所示:

data_qual <- data.frame(NAME=c("NAME1","NAME1","NAME2"),ID=c(47,47,259),SURVEY_YEAR=c(1961,1964,2010), REFERENCE_YEAR=c(1960,1962,2006),VALUE_SURYEAR=c("-X","ST","+x"),VALUE_REFYEAR=c("-X","ST","+x"))

data_qual
  NAME  ID SURVEY_YEAR REFERENCE_YEAR VALUE_SURYEAR VALUE_REFYEAR
1 NAME1  47        1961           1960            -X            -X
2 NAME1  47        1964           1962            ST            ST
3 NAME2 259        2010           2006            +x            +x

我如何绘制从REFERENCE_YEARSURVEY_YEAR 的线,并在中间的线上方绘制定性VALUE_(取自VALUE_SURYEARVALUE_REFYEAR 无关紧要,因为它们总是相同)并将其合并到我的情节循环中?有谁知道我如何做到这一点?

这是我试图为第一个情节做的图形近似:

有没有办法可以将它合并到我的情节代码中?感谢您的帮助!

【问题讨论】:

    标签: r plot dataframe


    【解决方案1】:

    这里有一个解决方案。

    这基本上是你的代码,但我为 ID +png 名称创建了一个新列ID2。然后我用lines() 函数和text() 函数创建了一个子循环来添加行和标签。

    xy <-data.frame( NAME = c("NAME1", "NAME1", "NAME1", "NAME1", "NAME1", "NAME1", 
    "NAME1", "NAME1", "NAME2", "NAME2", "NAME2", "NAME2", "NAME2", "NAME2", "NAME2", "NAME2", "NAME2", "NAME2"),
     ID=c(47,47,47,47,47,47,47,47,259,259,259,259,259,259,259,259,259,259),
    YEAR=c(1959,1960,1960,1961,1961,1963,1963,1965,2004,2007,2007,2009,2009,2010,2010,2011,2011,2014),
    VALUE=c(0,-6,-6,-16,-16,-31,-31,-54,0,-9,-9,-24,-24,-69,-69,-92,-92,-132))
    
    
    xy$ID2 <-paste(xy$ID, ".png", sep = "") # Add .png Fileextension
    ind <- split(x = xy,f = xy[,'ID']) # index split by ID
    
    data_qual <- data.frame( NAME= c("NAME1", "NAME1", "NAME2"), 
        ID=c(47,47,259), SURVEY_YEAR=c(1961,1964,2010),
         REFERENCE_YEAR=c(1960,1962,2006),
         VALUE_SURYEAR=c("-X","ST","+x"),VALUE_REFYEAR=c("-X","ST","+x"))
    
    ### PLOT
    for(i in 1:length(ind)){
      png(names(ind[i]), width=3358, height=2329, res=300)
      par(mar=c(6,8,6,5))
      plot(ind[[i]][,c('YEAR','VALUE')],
         type='n',
         main=ind[[i]][1,'NAME'],
         xlab="Time [Years]", 
         ylab="Length change [m]")  
     # plot axis
     axis(1, at = seq(1000,2030,10), cex.axis=1, labels=FALSE, tcl=-0.3) 
     # plot points and lines
     points(ind[[i]][,c('YEAR','VALUE')], type="l", lwd=2)
     points(ind[[i]][,c('YEAR','VALUE')], type="p", lwd=1, cex=1,   pch=21, bg='white')  
     for(j in 1 : nrow(data_qual[data_qual$ID==names(ind[i]),])) {
    lines(
      x=c(data_qual[data_qual$ID==names(ind[i]),]$REFERENCE_YEAR[j], data_qual[data_qual$ID==names(ind[i]),]$SURVEY_YEAR[j] ), 
      y=c(min(ind[[i]][,"VALUE"]), min(ind[[i]][,"VALUE"]) )
    )
    text(
      x=mean(c(data_qual[data_qual$ID==names(ind[i]),]$REFERENCE_YEAR[j], data_qual[data_qual$ID==names(ind[i]),]$SURVEY_YEAR[j])),
      y=min(ind[[i]][,"VALUE"]+3),
      labels=as.character(data_qual[data_qual$ID==names(ind[i]),]$VALUE_SURYEAR[j]) 
    )
    }
     dev.off()  
    
     }
    }
    

    【讨论】:

    • 谢谢。这就是我一直在寻找的!为了工作,似乎缺少一行:ind2
    • @redshoe 我想我只是偶然将ind 更改为ind2。我把它改回来了,所以我现在认为你可以使用ind。对此感到抱歉。
    • 我似乎遇到了您的解决方案的问题,尽管就我理解您的代码而言它应该可以工作。我在这里发布了一个关于我的一些实际数据(不是样本数据)的新问题:stackoverflow.com/questions/25733969/… 如果你能看一下会很棒吗?谢谢!
    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2018-12-15
    • 2016-01-31
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多