Сохранить единицу измерения в facet_wrap, а scale ="free_y"?

Я пытаюсь создать facet_wrap() где единица измерения остается одинаковой на разных графиках, в то же время позволяя скользить по оси Y.

Чтобы уточнить, я имею в виду, я создал набор данных df:

library(tidyverse)

df <- tibble(
  Year = c(2010,2011,2012,2010,2011,2012),
  Category=c("A","A","A","B","B","B"),
  Value=c(1.50, 1.70, 1.60, 4.50, 4.60, 4.55)
)

с df, мы можем создать следующий сюжет, используя facet_wrap:

ggplot(data = df, aes(x=Year, y=Value)) + geom_line() + facet_wrap(.~ Category)

Участок 1

Чтобы уточнить различия между обоими участками, можно использовать scale = "free_y":

ggplot(data = df, aes(x=Year, y=Value)) + geom_line() 
 + facet_wrap(.~ Category, scale="free_y")

Участок 2

Хотя это более понятно, масштаб по оси Y в сюжете A равно 0,025, а 0,0125 в B, Это может ввести в заблуждение того, кто сравнивает A & B рядом друг с другом.

Поэтому мой вопрос сейчас состоит в том, чтобы узнать, существует ли элегантный способ построения чего-то вроде графика ниже (с y-scale = 0.025) без необходимости наносить два отдельных графика в сетку?

Спасибо

Желаемый результат: Код для сетки:

# Grid
## Plot A
df_A <- df %>%
  filter(Category == "A") 
plot_A <- ggplot(data = df_A, aes(x=Year, y=Value)) + geom_line() +  coord_cartesian(ylim = c(1.5,1.7)) + ggtitle("A")

## Plot B
df_B <- df %>%
  filter(Category == "B") 
plot_B <- ggplot(data = df_B, aes(x=Year, y=Value)) + geom_line()  + coord_cartesian(ylim = c(4.4,4.6)) + ggtitle("B")

grid.arrange(plot_A, plot_B, nrow=1)

1 ответ

Решение

Основываясь на информации в разделе Установка индивидуальных ограничений по оси Y с фасетной оберткой, НЕ с масштабами free_y вы можете использовать geom_blank() и заданные вручную пределы по Category:

# df from above code
df2 <- tibble(
  Category = c("A", "B"),
  y_min = c(1.5, 4.4),
  y_max = c(1.7, 4.6)
)

df <- full_join(df, df2, by = "Category")

ggplot(data = df, aes(x=Year, y=Value)) + geom_line() + 
  facet_wrap(.~ Category, scales = "free_y") +
  geom_blank(aes(y = y_min)) +
  geom_blank(aes(y = y_max))

Другие вопросы по тегам