#r #ggplot2 #gganimate
#r #ggplot2 #gganimate
Вопрос:
С помощью набора данных для баскетбола я пытаюсь создать анимацию линейного графика с метрикой EPV по оси y и временем по оси x. Я могу заставить это работать, но теперь я хотел бы добавить текстовые метки в определенные моменты времени, когда event
они возникают. Это event
когда в баскетбольной игре происходит действие, например, владение мячом, ведение мяча или передача. Вот что у меня есть до сих пор:
library(tidyverse)
library(gganimate)
library(ggrepel)
theme_set(theme_minimal())
epv_curve_228 <- read_csv("https://raw.githubusercontent.com/jasonbaik94/stackoverflow-data/master/epv_curve_228.csv")
epv_curve_228 %>%
ggplot()
geom_path(aes(x = 720 - game_clock, y = epv.smooth))
# Add description of event for home players
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = h1_event), force = 5)
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = h2_event), force = 5)
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = h3_event), force = 5)
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = h4_event), force = 5)
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = h5_event), force = 5)
# Add description of event for away players
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = a1_event), force = 5)
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = a2_event), force = 5)
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = a3_event), force = 5)
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = a4_event), force = 5)
geom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = a5_event), force = 5)
transition_reveal(720 - game_clock)
labs(x = "Time (Seconds)",
y = "EPV",
title = "Possession #228 EPV")
Проблема в том, что ОТОБРАЖАЮТСЯ НЕ ВСЕ текстовые метки (события, такие как Дриблинг, Владение и т. Д.). Я знаю, что метки NA можно устранить, заменив NA на «». Я не уверен, как я могу показать все текстовые метки, связанные со всеми событиями. Я вижу как минимум 4 разных event
значения
Комментарии:
1. Я не могу воспроизвести вашу проблему, но причиной этого может быть
geom_label_repel
неправильное использование. Вы должны передать все метки в одном вызове, чтобы они были отброшены. Теперь каждыйgeom_label_repel
вызов имеет только одну запись.2. Ой, извините, я забыл включить свои пакеты. Я сделал это
3. @PoGibas я использовал
gather
в своем наборе данных и передал все свои метки за один вызов, используяgeom_label_repel(aes(x = 720 - game_clock, y = epv.smooth, label = event))
, но это все равно вызывает у меня ту же проблему
Ответ №1:
Вот подход. Я счел полезным объединить события, а затем заполнить несколько следующих строк (в данном случае 5, чтобы выровнять по 100 кадрам и ~ 500 строкам), чтобы избежать пропущенных событий, которые могут произойти между кадрами анимации.
epv_curve_228_excerpt <- epv_curve_228 %>%
select(game_clock, epv.smooth, ends_with("event")) %>%
unite(event, a1_event:h5_event) %>%
mutate(event = str_remove_all(event, "NA|_")) %>%
# Add event to a few following time stamps so we don't miss any in our frames
mutate(event_count = cumsum(event != "")) %>%
group_by(event_count) %>%
mutate(event_fill = if_else(row_number() <= 5, first(event), "")) %>%
ungroup()
a <- ggplot(epv_curve_228_excerpt,
aes(x = 720 - game_clock,
y = epv.smooth,
label = event_fill))
geom_path()
geom_label_repel(nudge_x = -1, size = 5)
transition_reveal(720 - game_clock)
shadow_wake(wake_length = 0.5, alpha = 0.7, size = 3,
exclude_layer = 1)
animate(a, nframes = 100, width = 600, height = 250)
Комментарии:
1. Отлично. Используйте
shadow_wake(..., wrap = F)
, чтобы не показывать последние метки в начале.