определить фиксированную ось Y для каждого фасета в facet_wrap ggplot2 - PullRequest
1 голос
/ 17 февраля 2020

Я использую gganimate для отображения переменных с течением времени, однако при использовании масштабов facet_wrap «исправлено» фиксирует график с наибольшим значением y из всех графиков или для «free_y» динамически изменяется, но использует наибольшее значение y из всех графиков. То, чего я хочу достичь, - это иметь фиксированную y, но разумную шкалу для каждого отдельного графика, так как изменения FLU едва заметны. Есть ли обходной путь для этого?

FLU =c(0.4300, 0.13414, 0.915712, 1.942392, 0.978331, 0.580650, 0.483317, 0.43815, 0.871458, 1.874808)
SAL =c(33.900467, 34.01290, 33.02704, 33.04964, 32.06871, 33.507627, 33.10071, 33.13046, 33.2947, 33.89)
SST =c(14.23996, 15.22347, 12.19740, 9.18255, 10.17654, 13.15929, 14.13632, 15.12981, 14.14976, 13.15758)

df = cbind(FLU,SAL,SST)
df<- as.data.table(df)
df <- mutate(df, seq = seq(1, 10, by = 1))
window_width = nrow(df)/5  # How much of the whole data to show at once
frames = 20   # Increase to make smoother animation & bigger file
shift_per_frame = (nrow(df) - window_width) / frames

# This bit of purrr copies the whole data frame [frames] times, identifying each with "id"
df_copied <- map_df(seq_len(frames), ~df, .id = "id") %>%
  mutate(id = as.integer(id)) %>%
  filter(seq >= id * shift_per_frame,
         seq <= id * shift_per_frame + window_width)
df_copied<- melt(df_copied,id.vars=c(1,5))

df_copied <- data.table(df_copied)
df_copied$variable<-as.factor(df_copied$variable)
df_copied[,y_min := value*0.5, by = variable]
df_copied[,y_max:= value*1.5, by = variable]

a <- ggplot(df_copied, aes(x = seq, y = value)) + 
  geom_line() +
  transition_manual(id) +
  facet_wrap(~variable, ncol=1,scales = "free_y")+
  geom_blank(aes(y = y_min)) +
  geom_blank(aes(y = y_max))+
  view_follow()
animate(a, nframes = frames)
...