R时间序列间隙填充,用于打印类型=';b';
我有一个.csv文件,有四列(名称、ID、年份、值,见下面的示例),我想用plot('YEAR'、'VALUE',type='b')绘制一些时间序列图。 由于时间序列中年份之间的一些数据缺失,我想写下包含年份之间NA值的新列,这样我就可以绘制数据,而不会在年份间隔中有连接线(在我的示例中:在BARTLEY项目中填写1984年至1987年的NA值) 有没有办法做到这一点??非常感谢您的帮助!谢谢 我的.csv文件如下所示:R时间序列间隙填充,用于打印类型=';b';,r,plot,time-series,na,R,Plot,Time Series,Na,我有一个.csv文件,有四列(名称、ID、年份、值,见下面的示例),我想用plot('YEAR'、'VALUE',type='b')绘制一些时间序列图。 由于时间序列中年份之间的一些数据缺失,我想写下包含年份之间NA值的新列,这样我就可以绘制数据,而不会在年份间隔中有连接线(在我的示例中:在BARTLEY项目中填写1984年至1987年的NA值) 有没有办法做到这一点??非常感谢您的帮助!谢谢 我的.csv文件如下所示: NAME; ID; YEAR; V
NAME; ID; YEAR; VALUE
NAME1; 885; 1988; -2
NAME1; 885; 1989; 0
NAME2; 2665; 1999; 4
NAME2; 2665; 2000; 8
NAME2; 2665; 2001; 19
NAME2; 2665; 2002; 13
NAME2; 2665; 2003; 13
NAME3; 893 ; 1983; 0
NAME3; 893 ; 1988; 2
NAME3; 893 ; 1989; -1
NAME4; 877 ; 1972; -1
NAME5; 894 ; 1973; -3
您可以使用read.csv中的sep=“;”来识别单独的值,从而读取所显示的文件。 你可以考虑下面的代码来读取数据,修改日期,添加NAs,然后绘制图表。我将您的数据放在一个名为“plot_test.txt”的文件中,以便read.csv从中获取数据。同样从您对BARTLEY项目的评论来看,我假设您希望将绘图中每个项目的行分开
# read data file into xx and change character years to Date values
xx <- read.csv("plot_test.txt",header=TRUE,sep=";")
xx$YEAR <- as.Date(paste(as.character(xx$YEAR),"-01-01",sep=""))
# create df as a template for all years and names
date_seq <- seq(min(xx$YEAR),max(xx$YEAR),by="12 month")
df <- merge(data.frame(NAME=unique(xx$NAME),ID=unique(xx$ID)),data.frame(YEAR=date_seq,VALUE=NA),all=TRUE)
# create unique names in xx and df to merge on
xx$NAME_YR <- paste(xx$NAME,xx$YEAR,sep="")
df$NAME_YR <- paste(df$NAME,df$YEAR,sep="")
# merge keeping only real data columns and restore original column names
xy <- merge(xx, df,by="NAME_YR",all=TRUE)[,c("NAME.y","ID.y","YEAR.y","VALUE.x")]
names(xy) <- names(xx)[1:4]
# plot xy using ggplot
library(ggplot2)
sp <- ggplot(data=xy, aes(x=YEAR, y=VALUE, colour=NAME)) + geom_point() + geom_line()
plot(sp)
#将数据文件读入xx并将字符年份更改为日期值
xx很高兴听到你找到了答案。我仍然想知道每页的绘图数量。我在代码中添加了几行代码,允许您设置绘图的行数和列数,以显示在一页上,然后根据需要循环显示尽可能多的绘图页。我还添加了一些ggplot的东西来改变plot文本的外观
# read data file into xx and change character years to Date values
xx <- read.csv("plot_test.txt",header=TRUE,sep=";")
xx$YEAR <- as.Date(paste(as.character(xx$YEAR),"-01-01",sep=""))
xx$NAME_YR <- paste(xx$NAME,xx$YEAR,sep="")
# create Year template for years between min and max years for each NAME
xxmin <- as.Date(tapply(xx$YEAR, xx$NAME, min ), origin="1970-01-01")
xxmax <- as.Date(tapply(xx$YEAR, xx$NAME, max ), origin="1970-01-01")
xxdates <- mapply(seq, xxmin, xxmax, by="12 month")
xxyears <- data.frame(NAME=rep(names(xxdates), sapply(xxdates, length)),
YEAR=as.Date(unlist (xxdates),origin="1970-01-01"))
xxyears$NAME_YR <- paste(xxyears$NAME,xxyears$YEAR,sep="")
# merge template and data and assign colnames to ploting data
xy <- merge(xx, xxyears, by="NAME_YR", all=TRUE)[,c("NAME.y","ID","YEAR.y","VALUE")]
names(xy) <- c("NAME","ID","YEAR","VALUE")
# plot each NAME in a separate chart with own time axis
library(ggplot2)
rows_pg <- 2 # number of rows of plots per page
cols_pg <- 2 # number of columns of plots per page
chts_pg <- rows_pg*cols_pg
num_plots <- nlevels(xy$NAME)
# set plot axis labels and main titles and set values for text
spttl <- ggtitle("Your plot title\nSecond line of your plot title")
spaxlb <- labs ( x="Year", y="Data Values")
spth <- theme(plot.title=element_text(size=16, face="bold", colour="blue") )
spth <- spth + theme(axis.title.x= element_text(size=14, colour="blue") )
spth <- spth + theme(axis.title.y = element_text(size=14, colour="blue") )
spth <- spth + theme(axis.text = element_text(size=14, colour="black") )
spth <- spth + theme(strip.text = element_text(size=14, colour="brown"))
# generate plots
for( iplt in seq(1,num_plots, chts_pg) ) {
sp <- ggplot(data=xy[xy$NAME %in% levels(xy$NAME)[iplt:(iplt+chts_pg-1)], ],
aes(x=YEAR, y=VALUE)) + geom_line() + geom_point()
sp <- sp + facet_wrap(~ NAME, scales="free_x", nrow=rows_pg, ncol=cols_pg)
plot(sp + spttl + spaxlb + spth)
}
#将数据文件读入xx并将字符年份更改为日期值
xx这不是csv文件。这只是我的csv外观的一个示例。如果你知道一个解决方案,能帮上忙就太好了。谢谢非常感谢你的回答。这正是我一直在寻找的。还有一个问题:是否有一种方法可以在打印时在x轴上不显示整个范围(例如xlim)?在那之后,我将这些图分开,做单xy图,大多数范围是从1960年到2010年,但我也有一些从1885年到1900年的数据。当单独绘制所有内容时,这将导致y轴调整到数据范围,而x轴不调整。附近有路吗?好的。我们将使拼盘数据有点不同,可能更接近您最初要求的数据,并且他们将每个名称绘制在一个单独的图表中,带有自己的时间轴。很高兴听到您找到了它。在R中总是有多种方法来做事情,特别是如果你使用额外的软件包,但这坚持使用R基础和常见的R函数。不,这正是我的目标,谢谢。最后,我想将绘图写入postscripts,其中NAME作为标题,ID作为ps的文件名。在合并过程中,我得到以下错误:fix.by(by.x,x)中的错误:“'by'必须指定唯一有效的列”。我能怎么办?太好了,非常感谢你的帮助!我自己彻底阅读了代码后就明白了!