2015-10-15 3 views
0

Недавно я задал вопрос о том, как создавать несколько графиков с 2-ю осями из одного и того же data.frame. Решение работает отлично (available here), однако я не могу заполнить область под кривой на второй оси y. «Полигон», похоже, является общим решением, но когда я пытаюсь вложить его в мой цикл, я не могу понять, как правильно выбрать координаты x и y. Любые предложения были бы полезны.R теневая область под кривой петля

Возпроизводимо образец:

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

Текущий код (отлично работает без "ого", "уу", и "полигона" линия):

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 отличаются.

+1

Пожалуйста, смотрите, как создать [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Добавьте примеры данных, чтобы мы могли запустить код, чтобы узнать, что происходит. Звучит как проблема с данными. – MrFlick

+0

Извините, я старался не вводить слишком много данных в один вопрос, поэтому я помещал ссылку на воспроизводимые данные из моего предыдущего вопроса. Я отредактирую и добавлю его. – KKL234

ответ

1

Ваша проблема возникла из-за того, что вы пытались нарисовать многоугольник. Нарисовать многоугольник на самом деле намного проще, чем вы пытались это сделать. Далее я подбираю данные для работы, поскольку это облегчает поиск ошибок (для меня). Если вы хотите вернуться к своему встроенному подмножеству, это будет нормально, поскольку это просто функциональный пример, показывающий, как использовать polygon().

Для цвета области под кривой Я предлагаю проверить rgb(), это позволяет вам присвоить значение альфа, чтобы не смыть остальную часть диаграммы.

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

Спасибо, это решение работает хорошо! Моя единственная проблема связана с графиком полигона: на самом деле это ось Y2, которую я пытаюсь создать для многоугольника (Depth Depth). Я поменял AvgRW на SampDepth в коде, который работает. Однако многоугольник нанесен на график относительно диапазона оси Y1; любая идея о том, как я могу заставить его заговорить против Y2? – KKL234

+1

Выяснил это! Просто нужно было перемещать местоположение команды polygon. Если поместить вторую строчку линии "plot (plotting [, c (1,4)], ...." он отлично работает! – KKL234