曲线环下的 R 阴影区域
R shade area under curve loop
我最近问了一个问题,关于如何从同一个 data.frame 生成具有 2 个 y 轴的多个图。该解决方案完美运行 ,但我似乎无法填充第二个 y 轴上曲线下方的区域。 "Polygon" 似乎是常见的解决方案,但是当我尝试将它嵌套在我的 for 循环中时,我不知道如何适当地 select 我的 x 和 y 坐标。任何建议都会有用。
可重现样本:
df6 <- structure(list(Year = c("2009", "2009", "2009", "2009", "2009",
"2009", "2009", "2009", "2009", "2009", "2009", "2009", "2009",
"2009", "2009", "2009", "2009", "2009", "2009", "2009", "2009",
"2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010",
"2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010",
"2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010",
"2011", "2011", "2011", "2011", "2011", "2011", "2011", "2011",
"2011", "2011", "2011", "2011", "2011", "2011", "2011", "2011",
"2011", "2011", "2011", "2011", "2011", "2011", "2012", "2012",
"2012"), plot = c("FA6", "FA7", "FK1", "FK2", "FK3", "FO1", "FO2",
"FO6", "GA2", "GA4", "GR1", "GR2", "HE2", "HE3", "LY1", "LY3",
"LY8", "NM2", "NM3", "TH3", "TH5", "BR1", "BR8", "FA5", "FA6",
"FA7", "FK1", "FK2", "FK3", "FO1", "FO2", "FO6", "GA2", "GA4",
"GR1", "GR2", "HE2", "HE3", "LY1", "LY3", "LY8", "NM2", "NM3",
"TH3", "TH5", "FA5", "FA6", "FA7", "FK1", "FK2", "FK3", "FO1",
"FO2", "FO6", "GA2", "GA4", "GR1", "GR2", "HE2", "HE3", "LY1",
"LY3", "LY8", "NM2", "NM3", "TH3", "TH5", "HE2", "HE3", "TH5"
), AvgRW = c(0.628666666666667, 0.485027777777778, 0.479269230769231,
0.826875, 0.633269230769231, 1.01830769230769, 1.34580555555556,
1.13061764705882, 0.422375, 1.377625, 0.535375, 0.366384615384615,
0.493119047619048, 0.300777777777778, 0.971923076923077, 1.02302941176471,
1.47245833333333, 1.00654166666667, 0.56425, 1.66342857142857,
1.28477586206897, 0.860666666666667, 2.10155130769231, 1.74626923076923,
0.616148148148148, 0.42775, 0.402576923076923, 0.859333333333333,
0.608961538461538, 1.28303846153846, 1.84344444444444, 1.52214705882353,
0.425546875, 1.66179166666667, 0.647208333333333, 0.390461538461538,
0.565892857142857, 0.237388888888889, 1.60419230769231, 1.16611764705882,
1.95329166666667, 1.18795833333333, 0.655928571428571, 2.009,
1.36198275862069, 2.61165384615385, 0.873296296296296, 0.596,
0.485884615384615, 1.13633333333333, 0.684461538461538, 1.30946153846154,
1.69747222222222, 1.64197058823529, 0.40740625, 1.40716666666667,
0.641625, 0.428576923076923, 0.729011904761905, 0.376222222222222,
1.52984615384615, 1.15317647058824, 1.66183333333333, 1.17904166666667,
0.604857142857143, 1.57425, 1.55772222222222, 0.7315, 0.119,
1.125875), SampDepth = c(27L, 18L, 13L, 12L, 13L, 13L, 18L, 17L,
32L, 12L, 12L, 13L, 14L, 18L, 13L, 17L, 12L, 12L, 14L, 14L, 29L,
21L, 13L, 13L, 27L, 18L, 13L, 12L, 13L, 13L, 18L, 17L, 32L, 12L,
12L, 13L, 14L, 18L, 13L, 17L, 12L, 12L, 14L, 14L, 29L, 13L, 27L,
18L, 13L, 12L, 13L, 13L, 18L, 17L, 32L, 12L, 12L, 13L, 14L, 18L,
13L, 17L, 12L, 12L, 14L, 4L, 9L, 2L, 1L, 8L)), .Names = c("Year",
"plot", "AvgRW", "SampDepth"), row.names = 2330:2399, class = "data.frame")
当前代码(没有 "xx"、"yy" 和 "polygon" 行也能完美运行):
for (i in df6$plot) { #start loop
png(filename = paste0("C:\Users\User\Desktop\", i, type="png")) #saves graphs
par(mar=c(5.1,4.1,4.1,5.1)) #increase right margin
xx <- c(df6[df6$plot==i, min(df6$Year)], x, df6[df6$plot==i, max(df6$Year)])
yy <- c(df6[df6$plot==i, min(df6$SampDepth)], y, df6[df6$plot==i, max(df6$SampDepth)])
polygon(xx, yy, col="gray")
plot(df6[df6$plot==i,c(1,3)],xaxt="n", type="l", ylab="Avg RW")
title(main=i,line=2.5) #add title
axis(1,at=as.integer(df6$Year),labels=df6$Year) #bottom axis
axis(3,at=as.integer(df6$Year),labels=df6$Year) #top axis
par(new = TRUE) #overlay for secondary y
plot(df6[df6$plot==i,c(1,4)],xaxt="n",yaxt="n", ylab="",type="l", col="red")
axis(4) #add secondary y axis
mtext("Sample Depth", side = 4, line=2) #add secondary y label
dev.off()
}
使用此代码时,我不断收到一条错误消息,指出我的 x 和 y 长度不同。
您的问题源于您尝试绘制多边形的方式。绘制多边形实际上比您尝试制作多边形要简单得多。此外,我将要处理的数据进行子集化,因为这样更容易发现错误(对我而言)。如果你想回到你的内联子集,那很好,因为这只是一个功能示例,向你展示如何使用 polygon()
。
对于曲线下区域的颜色,我建议查看 rgb()
它允许您分配一个 alpha 值,以免冲掉图表的其余部分。
干杯!
for (i in df6$plot) { #start loop
## Cut out the data you are working with
plotting <- df6[which(df6$plot == i),]
## Begin plotting
png(filename = paste0("C:\Users\User\Desktop\", i, type="png")) #saves graphs
par(mar=c(5.1,4.1,4.1,5.1)) #increase right margin
plot(plotting[,c(1,3)],xaxt="n", type="l", ylab="Avg RW")
## This is what I added
# This will tell R how to plot the polygon, it need the x values (years) ascending and descending
# And it needs y values (AvgRW) for the above 0 values as well as the 0 values.
xx <- c(unique(plotting$Year),rev(unique(plotting$Year)))
yy <- c(plotting$AvgRW,rep(0,length(unique(plotting$Year))))
polygon(xx, yy, col="gray")
title(main=i,line=2.5) #add title
axis(1,at=as.integer(plotting$Year),labels=plotting$Year) #bottom axis
axis(3,at=as.integer(plotting$Year),labels=plotting$Year) #top axis
par(new = TRUE) #overlay for secondary y
plot(plotting[,c(1,4)],xaxt="n",yaxt="n", ylab="",type="l", col="red")
axis(4) #add secondary y axis
mtext("Sample Depth", side = 4, line=2) #add secondary y label
dev.off()
}
我最近问了一个问题,关于如何从同一个 data.frame 生成具有 2 个 y 轴的多个图。该解决方案完美运行
可重现样本:
df6 <- structure(list(Year = c("2009", "2009", "2009", "2009", "2009",
"2009", "2009", "2009", "2009", "2009", "2009", "2009", "2009",
"2009", "2009", "2009", "2009", "2009", "2009", "2009", "2009",
"2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010",
"2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010",
"2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010",
"2011", "2011", "2011", "2011", "2011", "2011", "2011", "2011",
"2011", "2011", "2011", "2011", "2011", "2011", "2011", "2011",
"2011", "2011", "2011", "2011", "2011", "2011", "2012", "2012",
"2012"), plot = c("FA6", "FA7", "FK1", "FK2", "FK3", "FO1", "FO2",
"FO6", "GA2", "GA4", "GR1", "GR2", "HE2", "HE3", "LY1", "LY3",
"LY8", "NM2", "NM3", "TH3", "TH5", "BR1", "BR8", "FA5", "FA6",
"FA7", "FK1", "FK2", "FK3", "FO1", "FO2", "FO6", "GA2", "GA4",
"GR1", "GR2", "HE2", "HE3", "LY1", "LY3", "LY8", "NM2", "NM3",
"TH3", "TH5", "FA5", "FA6", "FA7", "FK1", "FK2", "FK3", "FO1",
"FO2", "FO6", "GA2", "GA4", "GR1", "GR2", "HE2", "HE3", "LY1",
"LY3", "LY8", "NM2", "NM3", "TH3", "TH5", "HE2", "HE3", "TH5"
), AvgRW = c(0.628666666666667, 0.485027777777778, 0.479269230769231,
0.826875, 0.633269230769231, 1.01830769230769, 1.34580555555556,
1.13061764705882, 0.422375, 1.377625, 0.535375, 0.366384615384615,
0.493119047619048, 0.300777777777778, 0.971923076923077, 1.02302941176471,
1.47245833333333, 1.00654166666667, 0.56425, 1.66342857142857,
1.28477586206897, 0.860666666666667, 2.10155130769231, 1.74626923076923,
0.616148148148148, 0.42775, 0.402576923076923, 0.859333333333333,
0.608961538461538, 1.28303846153846, 1.84344444444444, 1.52214705882353,
0.425546875, 1.66179166666667, 0.647208333333333, 0.390461538461538,
0.565892857142857, 0.237388888888889, 1.60419230769231, 1.16611764705882,
1.95329166666667, 1.18795833333333, 0.655928571428571, 2.009,
1.36198275862069, 2.61165384615385, 0.873296296296296, 0.596,
0.485884615384615, 1.13633333333333, 0.684461538461538, 1.30946153846154,
1.69747222222222, 1.64197058823529, 0.40740625, 1.40716666666667,
0.641625, 0.428576923076923, 0.729011904761905, 0.376222222222222,
1.52984615384615, 1.15317647058824, 1.66183333333333, 1.17904166666667,
0.604857142857143, 1.57425, 1.55772222222222, 0.7315, 0.119,
1.125875), SampDepth = c(27L, 18L, 13L, 12L, 13L, 13L, 18L, 17L,
32L, 12L, 12L, 13L, 14L, 18L, 13L, 17L, 12L, 12L, 14L, 14L, 29L,
21L, 13L, 13L, 27L, 18L, 13L, 12L, 13L, 13L, 18L, 17L, 32L, 12L,
12L, 13L, 14L, 18L, 13L, 17L, 12L, 12L, 14L, 14L, 29L, 13L, 27L,
18L, 13L, 12L, 13L, 13L, 18L, 17L, 32L, 12L, 12L, 13L, 14L, 18L,
13L, 17L, 12L, 12L, 14L, 4L, 9L, 2L, 1L, 8L)), .Names = c("Year",
"plot", "AvgRW", "SampDepth"), row.names = 2330:2399, class = "data.frame")
当前代码(没有 "xx"、"yy" 和 "polygon" 行也能完美运行):
for (i in df6$plot) { #start loop
png(filename = paste0("C:\Users\User\Desktop\", i, type="png")) #saves graphs
par(mar=c(5.1,4.1,4.1,5.1)) #increase right margin
xx <- c(df6[df6$plot==i, min(df6$Year)], x, df6[df6$plot==i, max(df6$Year)])
yy <- c(df6[df6$plot==i, min(df6$SampDepth)], y, df6[df6$plot==i, max(df6$SampDepth)])
polygon(xx, yy, col="gray")
plot(df6[df6$plot==i,c(1,3)],xaxt="n", type="l", ylab="Avg RW")
title(main=i,line=2.5) #add title
axis(1,at=as.integer(df6$Year),labels=df6$Year) #bottom axis
axis(3,at=as.integer(df6$Year),labels=df6$Year) #top axis
par(new = TRUE) #overlay for secondary y
plot(df6[df6$plot==i,c(1,4)],xaxt="n",yaxt="n", ylab="",type="l", col="red")
axis(4) #add secondary y axis
mtext("Sample Depth", side = 4, line=2) #add secondary y label
dev.off()
}
使用此代码时,我不断收到一条错误消息,指出我的 x 和 y 长度不同。
您的问题源于您尝试绘制多边形的方式。绘制多边形实际上比您尝试制作多边形要简单得多。此外,我将要处理的数据进行子集化,因为这样更容易发现错误(对我而言)。如果你想回到你的内联子集,那很好,因为这只是一个功能示例,向你展示如何使用 polygon()
。
对于曲线下区域的颜色,我建议查看 rgb()
它允许您分配一个 alpha 值,以免冲掉图表的其余部分。
干杯!
for (i in df6$plot) { #start loop
## Cut out the data you are working with
plotting <- df6[which(df6$plot == i),]
## Begin plotting
png(filename = paste0("C:\Users\User\Desktop\", i, type="png")) #saves graphs
par(mar=c(5.1,4.1,4.1,5.1)) #increase right margin
plot(plotting[,c(1,3)],xaxt="n", type="l", ylab="Avg RW")
## This is what I added
# This will tell R how to plot the polygon, it need the x values (years) ascending and descending
# And it needs y values (AvgRW) for the above 0 values as well as the 0 values.
xx <- c(unique(plotting$Year),rev(unique(plotting$Year)))
yy <- c(plotting$AvgRW,rep(0,length(unique(plotting$Year))))
polygon(xx, yy, col="gray")
title(main=i,line=2.5) #add title
axis(1,at=as.integer(plotting$Year),labels=plotting$Year) #bottom axis
axis(3,at=as.integer(plotting$Year),labels=plotting$Year) #top axis
par(new = TRUE) #overlay for secondary y
plot(plotting[,c(1,4)],xaxt="n",yaxt="n", ylab="",type="l", col="red")
axis(4) #add secondary y axis
mtext("Sample Depth", side = 4, line=2) #add secondary y label
dev.off()
}