Восемь лет спустя пакет ggforce
предлагает расширение facet_zoom()
, которое является реализацией предложения Хэдли Уикхема , чтобы показать два графика (как указано в ответе Брайана Диггса).
Фасет масштабирования
library(ggforce)
ggplot(df) +
aes(x = b, y = a) +
geom_col() +
facet_zoom(ylim = c(0, 10))
К сожалению, текущая версия ggforce
0.2.2 выдает ошибку с coord_flip()
, поэтому могут отображаться только вертикальные полосы.
Увеличенный фасет показывает вариации малых значений, но по-прежнему содержит большую - теперь обрезанную - a4
полосу. Параметр zoom.data
определяет, какие значения отображаются в увеличенном фасете:
library(ggforce)
ggplot(df) +
aes(x = b, y = a) +
geom_col() +
facet_zoom(ylim = c(0, 10), zoom.data = ifelse(a <= 10, NA, FALSE))
Два сюжета
предложила Хэдли Уикхэм
Я думаю, что гораздо более уместно показать два графика - один для всех данных и один только для небольших значений.
Этот код создает два графика
library(ggplot2)
g1 <- ggplot(df) +
aes(x = b, y = a) +
geom_col() +
coord_flip()
g2 <- ggplot(df) +
aes(x = b, y = a) +
geom_col() +
coord_flip() +
ylim(NA, 10)
которые можно объединить в один сюжет
cowplot::plot_grid(g1, g2) # or ggpubr::ggarrange(g1, g2)
or
gridExtra::grid.arrange(g1, g2) # or egg::ggarrange(g1, g2)
Две грани
Это было предложено в комментарии Чейза, а также Брайаном Диггсом в его ответе, который интерпретировал предложение Хэдли использовать
фасетные графики, один со всеми данными, один увеличенный в определенном регионе
но до сих пор не было предоставлено кода для этого подхода.
Поскольку нет простого способа масштабировать фасеты по отдельности (см., Например, связанный вопрос), данными необходимо управлять:
library(dplyr)
library(ggplot2)
ggplot() +
aes(x = b, y = a) +
geom_col(data = df %>% mutate(subset = "all")) +
geom_col(data = df %>% filter(a <= 10) %>% mutate(subset = "small")) +
coord_flip() +
facet_wrap(~ subset, scales = "free_x")
person
Uwe
schedule
06.05.2019
log
, которая упростит чтение графика. - person Ramnath   schedule 25.08.2011facet_wrap()
сscales = "free_x"
- person Chase   schedule 25.08.2011