0

I recently asked a question on how to produce multiple plots with 2 y-axes from the same data.frame. The solution works perfectly (available here), however I can't seem to fill in the area under the curve on the second y-axis. "Polygon" seems to be the common solution, but when I try to nest it within my for-loop, I can't figure out how to appropriately select my x and y coordinates. Any suggestions would be useful.

Reproducible sample:

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")

Current code (works perfectly without the "xx", "yy", and "polygon" lines):

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()
}

When using this code, I keep getting an error message that my x and y lengths differ.

Community
  • 1
  • 1
KKL234
  • 367
  • 1
  • 5
  • 23
  • 1
    Please see how to create a [reproducible example](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Include sample data so we can run the code to see what's happening. Sounds like a data problem. – MrFlick Oct 15 '15 at 19:27
  • Sorry, I was trying to avoid putting too much data into one question, so I put the link to the reproducible data from my earlier question. I'll edit and add it in. – KKL234 Oct 15 '15 at 19:30

1 Answers1

1

Your problem originated in the way you were attempting to draw a polygon. Drawing a polygon is actually much simpler than you were trying to make it. Further I subset out the data to work with as it makes it easier to find mistakes (for me). If you want to go back to your in-line subsetting that will be fine as this is just a functional example to show you how to use polygon().

For the colour of the area under the curve I suggest checking out rgb() it allows you to assign an alpha value so as to not wash out the rest of your chart.

Cheers!

 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()
}
Badger
  • 1,043
  • 10
  • 25
  • Thanks, this solution works well! My only issue is with the polygon plot: it's actually the Y2 axis I'm trying to create the polygon for (Sample Depth). I've swapped out AvgRW for SampDepth in the code, which works. However, the polygon is plotting against the Y1 axis range; any idea on how I can get it to plot against Y2? – KKL234 Oct 20 '15 at 20:24
  • 1
    Figured it out! Just had to move the location of the polygon command. If placed under the second plotting line "plot(plotting[,c(1,4)], ...." it works perfectly! – KKL234 Oct 20 '15 at 20:30