Ggplot2: нет свободных осей при использовании geom_dotplot с facet_grid

Я пытаюсь создать серию точечных графиков вместе, используя facet_grid. При этом я заметил, что geom_dotplot не отвечает на аргумент facet_grid scales = "free_y".

Вот пример кода:

require(ggplot2)

#Example data
set.seed(3)
df = data.frame(Gene = rep(c("a", "b", "c", "d"), each=20),
                ToD = rep(c("Morning", "Evening"), times = 40),
                Expression = c(runif(20, min=0, max=10),
                               runif(20, min=0, max=1),
                               runif(20, min=0, max=1000),
                               runif(20, min=0, max=100)))

#Box plots of example data
ggplot(df, aes(x = ToD, y = Expression)) +
    geom_boxplot() +
    facet_grid(Gene ~ ., scales = "free_y")

#Dot plots of example data
ggplot(df, aes(x = ToD, y = Expression)) +
    geom_dotplot(binaxis = "y", stackdir = "centerwhole") +
    facet_grid(Gene ~ ., scales = "free_y")

И вот версии R и ggplot2, которые я сейчас использую:

  • R версия 3.2.2 (2015-08-14)
  • ggplot2_1.0.1.9003

Поэтому, когда я создаю графические диаграммы, все работает так, как ожидалось, с масштабированием оси y соответственно для каждой строки фасета:

Box plots of test data

Тем не менее, точечные графики сохраняют одни и те же шкалы оси Y для каждой строки грани:

Dot plots of test data

Я читал об известной ошибке в ggplot2, где coord_flip и facet_grid не работают вместе при указании свободных масштабов. Связано ли это с той же проблемой?

Пока я мог генерировать каждый из участков отдельно, а затем объединять их с grid.arrange, это громоздко для моих целей. Я пытаюсь выстроить эти точки с другими гранями, и я бы хотел избежать необходимости регенерировать всех тех, кто использует grid.arrange. Любые мысли?

Спасибо за любую помощь, которую вы можете предложить, и, пожалуйста, дайте мне знать, если я смогу предоставить дополнительные разъяснения.

Ответ 1

Я читал документ в ?geom_dotplot. По-видимому, опцию binpositions можно установить на "all" (все данные вместе) или "bygroup"; по умолчанию. Таким образом, используя Gene как в виде группы, так и в виде граней, бинпозиции могут меняться и, по крайней мере, возвращается свободная ось y:

ggplot(df, aes(x = ToD, y = Expression, group=Gene)) +
  geom_dotplot(binaxis = "y", stackdir = "centerwhole", binpositions="bygroup") +
  facet_grid(Gene ~ ., scales = "free_y")

введите описание изображения здесь

Но теперь группировка по оси х исчезла. Вероятно, лучшее решение, но группировка по взаимодействию между Gene и ToD, казалось, решила его:

 ggplot(df, aes(x = ToD, y = Expression, group=interaction(Gene,ToD))) +
  geom_dotplot(binaxis = "y", stackdir = "centerwhole", binpositions="bygroup") +
  facet_grid(Gene ~ ., scales = "free_y")

введите описание изображения здесь