R:重新构造data.frame以正确绘制线、线()和点()解决方案
我的示例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,-
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]))
}