4

この質問に十分に答える以前に投稿された質問を見つけることができませんでした。以前の投稿では、受け入れられた回答は、以前にレンダリングされたレイヤーを永続的に保つために shadow_mark を使用していました。

R gganimate でアニメーションを実行している間、データの以前のレイヤーを保持するにはどうすればよいですか?

ポイントをgganimateに保管する

これは、散布図で出力を表示する場合は問題ない回避策ですが、累積測定ではなく、積み上げ棒グラフなどを実行しようとすると失敗します。

次のデータを検討してください。df で遷移状態を使用して、累積積み上げ棒グラフを作成したいと考えています。

df <- data.frame(t = c(2000, 2000, 2001, 2001, 2002, 2002), 
                 f = c("y", "n", "y", "n", "y", "n"),
                 x = c("a", "a", "b", "c", "a", "c"),
                 y = c(2,3,5,1,4,8))
> df
     t f x y
1 2000 y a 2
2 2000 n a 3
3 2001 y b 5
4 2001 n c 1
5 2002 y a 4
6 2002 n c 8

2000 年のデータを表示したいのですが、次のレイヤーに 2001 年のデータを前のレイヤーとの累積として追加したいと考えています。繰り返しますが、次のレイヤーでは、2002 年のデータを 2000 年と 2001 年の累積として追加したいと思います。

これは、shadow_mark が累積データのソリューションではない理由を示しています。

ggplot(df, aes(x=x, y=y, fill=f)) +
geom_col() + labs(x=NULL, y=NULL, fill=NULL, title="{closest_state}") +
transition_states(t, transition_length = 2, state_length = 1) +
shadow_mark() + enter_fade() + exit_shrink() + ease_aes('sine-in-out') + theme_bw() 

shadow_mark

shadow_mark への呼び出しを追加すると、累積プロットの望ましい結果が得られません。「a」の累計は 9 になるはずです。

c(2000)データを、c(2000,2001)、およびの 3 つの異なる df にサブセット化しc(2000,2001,2002)、新しい状態列を作成した後に rbind することは可能ですが、それは非常にハッキーなアプローチのようです。

gganimate に組み込まれているツールを使用して、累積データを表示するよりクリーンな方法はありますか?

4

2 に答える 2

0

ヒストグラムのトリックは、以前の遷移値を複製して累積ビルドを確実にすることであることがわかりました。

# packages my mac needs for gganimate to work
if (!require("pacman")) install.packages("pacman")
pacman::p_load(dplyr, gganimate, gifski, png)

# vector of values to plot in histogram
sampling_dist_v1 <- rnorm(1e3)

# create a transition sequence variable
init_seq <- c(1, rep(2,10), rep(3,10))

observed_rates <- 
  tibble(
    observed_rate = sampling_dist_v1,
    transition_sequence = c(init_seq, rep(4, length(sampling_dist_v1) - length(init_seq)))
  )

# duplicate earlier entries to ensure animation is cumulative
t_sub_4 <- 
  observed_rates %>% 
  filter(transition_sequence < 4) %>% 
  mutate(transition_sequence = 4)

t_sub_3 <- 
  observed_rates %>% 
  filter(transition_sequence < 3) %>% 
  mutate(transition_sequence = 3)

t_sub_2 <- 
  observed_rates %>% 
  filter(transition_sequence < 2) %>% 
  mutate(transition_sequence = 2)

observed_rates <- 
  bind_rows(
    observed_rates,
    t_sub_4, 
    t_sub_3, 
    t_sub_2
  ) 

# animate
anim <- observed_rates %>% 
  ggplot(aes(x = observed_rate)) + 
  geom_histogram(binwidth = .25, fill = 'blue') + 
  transition_states(
    transition_sequence,
    state_length = 4,
    wrap = FALSE
    )

[![enter image description here][1]][1]


  [1]: https://i.stack.imgur.com/vyJ8m.gif
于 2021-05-28T20:40:44.637 に答える