2015-10-12 4 views
0

Я пытаюсь создать очень конкретный графический вывод и не могу найти пакет, который может делать все, что я ищу. Прежде всего, мне нужно: (1) Произвести несколько графиков (facet_wrap в ggplot отлично работает) (2) Имеют 2 оси y с различными шкалами (решетка кажется лучшим для этого) (3) Создайте график, похожий на вывод из «графика» с использованием dplRR plot 2 axis multiple plot

У меня есть кадр данных с несколькими уникальными сайтами. Я хотел бы рассчитать среднегодовое значение каждого сайта в виде линейного графика, а второй график линии - на другой оси y, представляющей глубину выборки. Я хотел бы создать отдельный сюжет для каждого сайта.

Ниже некоторые воспроизводимые данные (небольшое подмножество), и то, что я пришел с до сих пор:

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

я могу получить большой макет с помощью ggplot и ggplus, но не могу показаться, чтобы добавить вторая ось у:

Plot1 <- ggplot(sites,aes(x=Year, y=AvgRW, group=plot)) + 
    theme(axis.text=element_text(size=4), 
      panel.grid.minor=element_blank(), 
      panel.grid.major=element_line(colour = "gray",size=0.5), 
      strip.text=element_text(size=8)) + 
    geom_line() 

facet_multiple(plot = Plot1, facets = 'plot', ncol = 1, nrow = 1, scales="free") 

Sample graph

Тогда я попробовал делать doubleYplot с решеткой и latticeExtra, но я не могу получить линии появляться:

Plot2a <- xyplot(AvgRW ~ Year, data=sites, groups=plot, 
       xlab=list("Year", fontsize = 12), 
       ylab = list("Avg RW (mm)", fontsize = 12), 
       ylab.right = list("Sample Depth", fontsize = 12), 
       par.settings = simpleTheme(col = 1), 
       type = c("l","g"), 
       lty=1, 
       scales=list(x=list(rot=90,tick.number=25, 
           cex=1,axs="r"))) 

> Plot2b <- xyplot(SampDepth ~ Year,data=sites, groups=plot, type = "o",col="black", 
       lty=9) 

> doubleYScale(Plot2a, Plot2b) 

Моя конечная цель состоит в том, чтобы произвести график, который похож на выход dplR, для каждого сайта в моем data.frame:

Intended output

Любые идеи о том, как объединить свои три цели был бы весьма признателен.

+0

Кстати, вы можете иметь [два у-ось] (http://rpubs.com/kohske/dual_axis_in_ggplot2) этикеток в GGplot – Jthorpe

+0

Спасибо. Я знаю, что ggplot может делать 2 оси меток, но я не знаю, как графа 2 строки с той же осью х, но разные значения y. – KKL234

+0

Ссылка в моем комментарии иллюстрирует, как иметь одинаковую шкалу по оси X и отдельным шкалам на левой и правой у-осях. Использование 'ncol = 1, nrow = 1, scale =" free "' производит одну цифру на слайд, что может быть выполнено с помощью 'pdf (blah, blah, blah); для (p в уникальном (site $ plot) show (Plot1% +% sites [sites $ plot == p]); dev.off() '. Если вы пытаетесь добавить вторую строку в том же y-масштабе , используйте 'Plot1 + geom_smooth (blah, blah, blah)' – Jthorpe

ответ

1

ggplot2 не поддерживает вторичную ось y, потому что его создатель полагает, что это может ввести в заблуждение. Тем не менее, вы можете сделать это с помощью base R. Вот цикл, который решает ваши проблемы: несколько графиков в цикле, вторичная ось y, аналогичный взгляд на прикрепленный сюжет. Я предположил, что вы в Windows и включил код для сохранения каждой диаграммы в каталоге/temp с помощью savePlot.

for (i in sites$plot){       #start loop 
par(mar=c(5.1,4.1,4.1,5.1))      #increase right margin 
plot(sites[sites$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(sites$Year),labels=sites$Year) #bottom axis 
axis(3,at=as.integer(sites$Year),labels=sites$Year) #top axis 
par(new = TRUE)          #overlay for secondary y 
plot(sites[sites$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 
savePlot(filename = paste0("c:/temp/",i, ".png"), type = "png") # save 
} 

enter image description here

UPDATE Если вы не на Windows, вы не можете использовать savePlot. Используйте обычную функцию png. Вы не увидите графики на экране, но они будут сохранены. Не забудьте изменить путь к тому, где вы хотите сохранить диаграммы. Я использую c:/temp/ в следующем коде, который не будет работать на машинах без окон.

for (i in sites$plot){       #start loop 
png(filename = paste0("c:/temp/",i, ".png")) # save 
par(mar=c(5.1,4.1,4.1,5.1))      #increase right margin 
plot(sites[sites$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(sites$Year),labels=sites$Year) #bottom axis 
axis(3,at=as.integer(sites$Year),labels=sites$Year) #top axis 
par(new = TRUE)          #overlay for secondary y 
plot(sites[sites$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() 
} 
+0

Спасибо! Это отлично работало; выходной график - это то, что я искал. Единственная проблема, с которой я столкнулся, - это фактический цикл: когда я запустил его в R, был только граф из графика data.frame. Я не мог найти ни одного из других графиков. Я применил его как к подмножеству data.frame, который я использовал выше, так и к собственному полному файлу data.frame, и в обоих случаях я мог получить только последний график. Есть идеи? – KKL234

+0

Я также должен добавить, что я получаю это сообщение об ошибке: «Ошибка в savePlot (filename = paste0 (« c:/temp/», i,« .png »), type =« png »): может копировать только из «оконных» устройств » – KKL234

+0

Да, я написал, что предположил, что вы были в Windows в моем первоначальном ответе. Я добавил обновление, которое будет работать на машинах без окон. Не забудьте изменить путь к тому, где вы хотите сохранить диаграммы (не должно быть c:/temp /) –