предварительные мероприятия
Определите исходный график и желаемые параметры для осей Y каждого фасета:
library(ggplot2)
g0 <- ggplot(mpg, aes(displ, cty)) +
geom_point() +
facet_grid(rows = vars(drv), scales = "free")
facet_bounds <- read.table(header=TRUE,
text=
"drv ymin ymax breaks
4 5 25 5
f 0 40 10
r 10 20 2",
stringsAsFactors=FALSE)
версия 1: подставить поддельные точки данных
Это не соответствует спецификации breaks
, но дает правильные границы:
Определите новый фрейм данных, который включает минимальные / максимальные значения для каждого drv
:
ff <- with(facet_bounds,
data.frame(cty=c(ymin,ymax),
drv=c(drv,drv)))
Добавьте их к графикам (они не будут построены, поскольку x
равно NA
, но они все еще используются при определении масштабов)
g0 + geom_point(data=ff,x=NA)
Это похоже на то, что делает expand_limits()
, за исключением того, что эта функция применяется «для всех панелей или всех графиков».
версия 2: определить, на какой панели вы находитесь
Это уродливо и зависит от каждой группы, имеющей уникальный диапазон.
library(dplyr)
## compute limits for each group
lims <- (mpg
%>% group_by(drv)
%>% summarise(ymin=min(cty),ymax=max(cty))
)
Функция разрывов: определяет, какая группа соответствует заданному набору ограничений ...
bfun <- function(limits) {
grp <- which(lims$ymin==limits[1] & lims$ymax==limits[2])
bb <- facet_bounds[grp,]
pp <- pretty(c(bb$ymin,bb$ymax),n=bb$breaks)
return(pp)
}
g0 + scale_y_continuous(breaks=bfun, expand=expand_scale(0,0))
Другое уродство здесь заключается в том, что мы должны установить expand_scale(0,0)
, чтобы сделать пределы точно равными ограничениям группы, что может быть не таким, каким вы хотите сюжет ...
Было бы неплохо, если бы в функцию breaks()
можно было каким-то образом передать некоторую информацию о том, какая панель в настоящее время вычисляется ...
Я думаю, что общий подход состоит в том, чтобы создавать отдельные графики, а затем сшивать их вместе, а не использовать грани. Некоторые идеи о том, как это сделать, показаны здесь и здесь
Я думаю, что ни одно из ваших предложений (
scale_y_continuous
илиcoord_cartesian
) не применимо по частям. Если это расширения шкалы данных, я также сделал это, добавив поддельные данные в набор данных (и сделав все необходимое, чтобы убедиться, что они учитываются при определении масштабов, но не отображаются на графике). Также можно использовать функциюbreaks()
, чтобы взломать это, определив, какой подзаговор в настоящее время рассматривается ...@BenBolker OP использует
mpg
, который является встроенным набором данных дляggplot2
ох! ..........
Эта проблема может быть решена установкой
scale_y_continuous(breaks=my_breaks,expand=expand_scale(mult= c(0,.1)))
, с помощью которой функцияmy_break
устанавливает разрывы, аexpand_scale
устанавливает пределы.