Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:重新构造data.frame以正确绘制线、线()和点()解决方案_R_Plot_Dataframe_Lines_Points - Fatal编程技术网

R:重新构造data.frame以正确绘制线、线()和点()解决方案

R:重新构造data.frame以正确绘制线、线()和点()解决方案,r,plot,dataframe,lines,points,R,Plot,Dataframe,Lines,Points,我的示例data.frame如下所示: xy <- data.frame(NAME=c("NAME1","NAME1","NAME1","NAME2","NAME2","NAME2"),ID=c(87,87,87,199,199,199), SURVEY_YEAR=c(1986,1994,1999,1909,1924,1927), REFERENCE_YEAR=c(1984,1986,1984,1899,1909,1924), VALUE_SURVEY_YEAR=c(20,50,-15,-

我的示例data.frame如下所示:

xy <- data.frame(NAME=c("NAME1","NAME1","NAME1","NAME2","NAME2","NAME2"),ID=c(87,87,87,199,199,199), SURVEY_YEAR=c(1986,1994,1999,1909,1924,1927), REFERENCE_YEAR=c(1984,1986,1984,1899,1909,1924), VALUE_SURVEY_YEAR=c(20,50,-15,-70,-80,-100),VALUE_REFERENCE_YEAR=c(75,25,-90,-8,-55,-10))

xy
       NAME  ID SURVEY_YEAR REFERENCE_YEAR VALUE_SURVEY_YEAR VALUE_REFERENCE_YEAR
1 NAME1  87        1986           1984                20                   75
2 NAME1  87        1994           1986                50                   25
3 NAME1  87        1999           1984               -15                  -90
4 NAME2 199        1909           1899               -70                   -8
5 NAME2 199        1924           1909               -80                  -55
6 NAME2 199        1927           1924              -100                  -10
之后,我将其按组(由
ID
定义)进行拆分,并将其绘制成单独的图形

  ind <- split(x = xy,f = xy[,'ID'])
    plot1 <- function(x) {
      fname <- paste0(x[1, 'ID'], '.png')
      png(fname, width=1679, height=1165, res=150)
      par(mar=c(6,8,6,5))
      plot(x = c(1946, 2014),
           y = range(x$VALUE, na.rm=TRUE),
           type='n',
           main=x[1, 'NAME'])
      points(x[,c('YEAR','VALUE')], type="l", lwd=2)
      points(x[,c('YEAR','VALUE')], type="p", lwd=1, cex=0.7, pch=21, bg='white')
    dev.off()
    }
    plot2 <- function(x) {
      fname <- paste0(x[1, 'ID'], '.png')
      png(fname, width=1679, height=1165, res=150)    
      par(mar=c(6,8,6,5))
      plot(x[,c('YEAR','VALUE')],
           type='n',
           main=x[1, 'NAME'])
    points(x[,c('YEAR','VALUE')], type="l", lwd=2)
    points(x[,c('YEAR','VALUE')], type="p", lwd=1, cex=0.7, pch=21, bg='white')
    dev.off() 
    }

    lapply(ind, function(x) ifelse(any(x$YEAR < 1946 & x$YEAR < 2014), plot2(x), plot1(x)))

ind使用原始数据的快速且肮脏的
ggplot
替代方案:

# create a grouping variable to be able to separate adjacent lines within each ID
xy$grp <- factor(ave(xy$ID, xy$ID, FUN = seq_along))

# plot
library(ggplot2)
ggplot(data = xy, aes(x = REFERENCE_YEAR,
                      xend =  SURVEY_YEAR,
                      y = VALUE_REFERENCE_YEAR,
                      yend = VALUE_SURVEY_YEAR,
                      colour = grp)) +
  geom_segment() +
  facet_wrap(~ ID, scales = "free_x") +
  xlab("Year") +
  ylab("Value") +
  theme(legend.position = "none")
#创建一个分组变量,以便能够分隔每个ID内的相邻行

xy$grp可能是这样的

x = c(xy$SURVEY_YEAR,xy$REFERENCE_YEAR)
y = c(xy$VALUE_SURVEY_YEAR, xy$VALUE_REFERENCE_YEAR)
tab = cbind(x,y)

plot(tab[,1], tab[,2])
for (i in 1:nrow(xy)) {
lines(c(xy$SURVEY_YEAR[i],xy$REFERENCE_YEAR[i]), c(xy$VALUE_SURVEY_YEAR[i], xy$VALUE_REFERENCE_YEAR[i]))
}

太复杂了,挖不透。你能清楚地说明你的原始数据框中的哪些数据列(以及哪些行子集)应该在每一行中绘制吗?@CarlWitthoft我试图在这里分解这个问题:如果你能看一下,那就太好了!这两个问题不是完全相同的吗?我错过了什么吗?你说得对@RichardScriven。有人要求我将所有问题都包括在一个问题中,对不起。这就是为什么我删除了另一个问题(试图把它缩短)。但我会很高兴听到关于如何解决这个问题的建议!一般来说,在ggplot中,这些类型的情节比较容易。这很好,谢谢@Henrik!但既然我在baseR做了所有的事情,你能想出一个解决baseR问题的办法吗?@redshoe,对不起,我现在帮不了你。希望有人愿意回答!这样做的问题是,它会将所有内容绘制到一个绘图中,而不是成组(由
ID
定义)
x = c(xy$SURVEY_YEAR,xy$REFERENCE_YEAR)
y = c(xy$VALUE_SURVEY_YEAR, xy$VALUE_REFERENCE_YEAR)
tab = cbind(x,y)

plot(tab[,1], tab[,2])
for (i in 1:nrow(xy)) {
lines(c(xy$SURVEY_YEAR[i],xy$REFERENCE_YEAR[i]), c(xy$VALUE_SURVEY_YEAR[i], xy$VALUE_REFERENCE_YEAR[i]))
}