Как добавить метки оси x на график с нечетным количеством панелей?

Возможный дубликат:
добавить "плавающий метки осей на графике facet_wrap

DataLink: https://www.dropbox.com/s/q45t9hng4mryi6y/GTAP_CCShocks2.csv< /а>

Код:

   # Loading the data
   climshocks <- read.csv(file = "F:/Purdue University/RA_Position/PhD_ResearchandDissert/PhD_Draft/GTAP-CGE/GTAP_NewAggDatabase/NewFiles/GTAP_CCShocks2.csv", header=TRUE, sep=",", na.string="NA", dec=".", strip.white=TRUE)

   # Data manipulations
   ccshocks <- as.data.frame(climshocks)
   ccshocks[4:4] <- sapply(ccshocks[4:4],as.numeric)
   ccshocks <- droplevels(ccshocks)
   ccshocks <- transform(ccshocks,region=factor(region,levels=unique(region)))

   library(reshape)
   library(ggplot2)
   library(grid)

   #--------------------------------------------------------------------------------
   #### Average of climate-induced yield percent change for all regions by crop
   #--------------------------------------------------------------------------------

   #_Code_Begin...
   Avgccshocks.f <- melt(ccshocks)
   Avgccshocks.f <- Avgccshocks.f[Avgccshocks.f$sres %in% c("AVERAGE"), ]

   PlotAvgccshocks <- ggplot(data = Avgccshocks.f, aes(factor(region), value))
   PlotAvgccshocks + geom_bar(stat="identity") + 
   theme(axis.text.x = element_text(colour = 'black', angle = 90, size = 14, hjust = 0.5, vjust = 0.5),axis.title.x=element_blank()) + 
   ylab("Yield(%change)") + theme(axis.text.y = element_text(colour = 'black', size = 14, hjust = 0.5, vjust = 0.5), axis.title.y = element_text(size = 14, hjust = 0.5, vjust = 0.5, face = 'bold')) + 
   theme(strip.text.x = element_text(size = 16, hjust = 0.5, vjust = 0.5, face = 'bold')) +
   facet_wrap(~crops, scales="free_y", ncol=3)
   ggsave("PlotAvgccshocks.png")

   #_Code_End...

Результат: Результирующий график

Мой вопрос: есть ли способ в ggplot добавить метки к оси x под двумя последними столбцами. Я знаю, что мог бы сделать это, заменив «free_y» на «free» в facet_wrap(), но это добавило бы метки ко всем панелям на графике, что сделало бы его неудобным для глаз.

Я ищу либо добавить метки прямо под двумя оставшимися столбцами, либо добавить два набора меток оси x, но на том же уровне, что и метки панели «wht».

Надеюсь, мой вопрос был ясен.

Заранее спасибо.

PS: я попытался использовать функцию, созданную Юлием в ответ на add «плавающие» метки осей на графике facet_wrap для решения проблемы, а код приведен ниже

    #7- Function to add x-axis labels to all plots using facet_wrap()
    #----------------------------------------------------------------

    library(grid)
    # pos - where to add new labels
    # newpage, vp - see ?print.ggplot
    facetAdjust <- function(x, pos = c("up", "down"), 
                    newpage = is.null(vp), vp = NULL)
    {
    # part of print.ggplot
    ggplot2:::set_last_plot(x)
    if(newpage)
    grid.newpage()
    pos <- match.arg(pos)
    p <- ggplot_build(x)
    gtable <- ggplot_gtable(p)

    # finding dimensions
    dims <- apply(p$panel$layout[2:3], 2, max)
    nrow <- dims[1]
    ncol <- dims[2]

    # number of panels in the plot
    panels <- sum(grepl("panel", names(gtable$grobs)))
    space <- ncol * nrow

    # missing panels
    n <- space - panels

    # checking whether modifications are needed
    if(panels != space){

    # indices of panels to fix
    idx <- (space - ncol - n + 1):(space - ncol)

    # copying x-axis of the last existing panel to the chosen panels  
    # in the row above

    gtable$grobs[paste0("axis_b",idx)] <- list(gtable$grobs[[paste0("axis_b",panels)]])
    if(pos == "down"){
    if pos == down then shifting labels down to the same level as 
    # the x-axis of last panel
    rows <- grep(paste0("axis_b\\-[", idx[1], "-", idx[n], "]"), 
               gtable$layout$name)
    lastAxis <- grep(paste0("axis_b\\-", panels), gtable$layout$name)
    gtable$layout[rows, c("t","b")] <- gtable$layout[lastAxis, c("t")]}}

    # again part of print.ggplot, plotting adjusted version
    if(is.null(vp)){
    grid.draw(gtable)}
    else{
    if (is.character(vp)) 
    seekViewport(vp)
    else pushViewport(vp)
    grid.draw(gtable)
    upViewport()}
    invisible(p)}

Итак, в основном я запускаю этот код для функции «facetAdjust()» и вызываю его для своего графика «PlotAvgccshocks», но появляется сообщение об ошибке следующего вида:

Сообщение об ошибке:

Ошибка facetAdjust (PlotAvgccshocks): нет слоев на графике

Есть предположения?

Спасибо еще раз


person iouraich    schedule 24.01.2013    source источник
comment
Я обновил вопрос, добавив код, созданный Юлием, для решения данной проблемы, тем не менее, как я упоминал выше, его запуск привел к описанному ранее сообщению об ошибке.   -  person iouraich    schedule 26.01.2013
comment
Проблема в том, что вы используете facetAdjust(PlotAvgccshocks), где PlotAvgccshocks — это только ggplot(...). То есть без +geom_bar(...) и т.д.   -  person Julius Vainora    schedule 26.01.2013
comment
Спасибо за разъяснения. Теперь он работает нормально. Еще одна вещь: я пытаюсь сохранить график с помощью команды ggsave(PlotAvgccshocks.png), и она сохраняет файл, но ось X не отображается. Любая подсказка, почему это происходит?   -  person iouraich    schedule 26.01.2013
comment
В этом случае проблема заключается в том, что facetAdjust принимает объект ggplot2 в качестве входных данных (тоже ggsave), но возвращает gtable. Поэтому я бы предложил использовать pdf(filename = "PlotAvgccshocks.png");facetAdjust(PlotAvgccshocks);dev.off()   -  person Julius Vainora    schedule 27.01.2013