Мое предлагаемое решение основано на ответе, предоставленном @user20650. Он отличается тем, что использует полуавтоматическую процедуру поиска индексов элементов гроба g1
, которые необходимо заменить элементами из g2
.
# library(ggplot2)
# library(grid)
p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
geom_point() +
facet_grid(vs ~ am)
# modify p1 by zooming as desired
p2 <- p1 + coord_cartesian(ylim = c(3,4)) +
theme_bw() +
theme(axis.text = element_text(color="blue"),
strip.text = element_text(color="blue"))
p1
p2
Теперь мы изменим пределы оси Y верхнего ряда граней. Мы создаем два гроба g1
и g2
и заменяем панели и ось Y в g1
соответствующими элементами из g2
.
Приведенный ниже код находит индексы элементов grob для замены на основе имен элементов.
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
# Replace the upper panels and upper axis of p1 with that of p2
# i.e. replace the corresponding grobs in g1 with the versions of g2
# Panel numbering goes row-wise from top left to bottom right
panels_to_replace_with_g2 <- c(1,2)
# To get names of grobs run: lapply(g1[["grobs"]],function(x) x$name)
# Use names of grobs to find out indices of g1[["grobs"]] of the panels we want to replace
# as well as for the axis ticks.
pattern_for_specific_panels <-
paste0("^panel-((",paste0(panels_to_replace_with_g2, collapse = ")|("),"))")
pattern_for_axes_ticks <-
"^GRID.absoluteGrob"
idx_panels_to_replace_from_g2 <- which(unlist(
lapply(g1[["grobs"]], function(x) grepl(pattern_for_specific_panels, x$name))))
# > idx_panels_to_replace_from_g2
# [1] 2 4
idx_axesTicks <- which(unlist(
lapply(g1[["grobs"]], function(x) grepl(pattern_for_axes_ticks, x$name))))
# Find out manually which of the defined axesTicks it is:
g_test <- g1
for (itr in idx_axesTicks) {
g_test[["grobs"]][[itr]] <- g2[["grobs"]][[itr]]
grid.newpage();grid.draw(g_test); grid.draw(textGrob(itr, just = "top"))
Sys.sleep(1)
}
# We found out it is itr=10
idx_axesTicks_to_replace <- 10
Узнав индексы заменяемых панелей idx_panels_to_replace_from_g2
, а также индекс элемента оси Y idx_axesTicks_to_replace
. Мы можем заменить их в следующем.
# Replace panels
grid.newpage();grid.draw(g1)
for (iter in idx_panels_to_replace_from_g2) {
g1[["grobs"]][[iter]] <- g2[["grobs"]][[iter]]
grid.newpage();grid.draw(g1)
Sys.sleep(1)
}
# Replace y-axis
g1[["grobs"]][[idx_axesTicks_to_replace]] <- g2[["grobs"]][[idx_axesTicks_to_replace]]
# Render plot
grid.newpage()
grid.draw(g1)
Если график успешно изменен, теперь вы можете удалить изменения темы и цвет текста, которые мы применили к p2, чтобы сделать изменения более заметными.
Будущее TODO
: Чего сейчас не хватает, так это увеличить ширину оси Y, чтобы учесть измененные метки оси.
person
fabern
schedule
27.08.2018
mt + facet_grid(vs ~ am, scales = "free") + coord_cartesian(ylim = c(3,4))
кажется, работает для меня, или, возможно, я не понимаю вопроса. - person mnel   schedule 31.08.2012facet_wrap
, и в этом случае ось X также соответствующим образом усеченаmt + facet_wrap(vs ~ am, scales = "free") + coord_cartesian(ylim = c(3,4))
- person mnel   schedule 31.08.2012shrink
вfacet_grid
и какой-то сводной функции, зависящей отy
и переменных фасетирования - person mnel   schedule 31.08.2012