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