Показать всю легенду, даже если категория не отображается на графике - PullRequest
1 голос
/ 01 октября 2019

Я работаю над графиком, чтобы показать схемы ударов бейсболистов.
Расположение на сетке соответствует месту удара по мячу, а цвет круга соответствует результату (одиночный, двойной, тройной). , Home Run, Out, жертва мухи).

Я повторяю этот график для нескольких игроков, но не у всех игроков есть попадание во всех категориях.

Я гарантировал, что результаты помечены втого же цвета (иначе было бы странно, если бы homeruns были зелеными для одного игрока, а ауты были зелеными для другого игрока).

Я хотел бы показать легенду, которая включает в себя все результаты (одиночный, двойной, тройной и т. д. ) даже для графиков, которые не отображают каждый из этих результатов. Для человека, просматривающего это, было бы полезно, например, признать, что у конкретного игрока нет домашних пробегов.

Есть какие-нибудь идеи относительно того, что мне не хватает?

#ggspraychart (data = correa, fill_value = "events")
spray_chart <- function(...) {
  ggplot(...) +
    geom_curve(x = 33, xend = 223, y = -100, yend = -100, curvature = -.65, color = "#36521A") +
    geom_segment(x = 128, xend = 33, y =-208, yend = -100, color = "#36521A") +
    geom_segment(x = 128, xend = 223, y =-208, yend = -100, color = "#36521A") +
    geom_curve(x = 83, xend = 173, y = -155, yend = -156, curvature = -.65, linetype = "dotted", color = "#36521A") +
    coord_fixed() +
    scale_x_continuous(NULL, limits = c(25, 225))+
    scale_y_continuous(NULL, limits = c(-225, -25))
}


spray_chart(PlayerNF_events, aes(x = hc_x, y = -hc_y, color = events)) +
  geom_point(size = 5) +
  labs(
  title = PlayerName,
  subtitle = "Regular season 2019 vs TB")+

  scale_color_manual(values = c("single" = "#DBA92A", "doule" = "#D98327", "triple" = "#CF5423", "home_run" = "#DE2723", "field_out" = "#3D5A5C", "sac_fly" = "#48475C")) +

  theme(
    # Remove panel border
    panel.border = element_blank(),  
    # Remove panel grid lines
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    # Remove panel background
    panel.background = element_blank(),
    # Add axis line
    axis.line = element_blank(),
    axis.ticks = element_blank(),
    axis.text = element_blank()
  )

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Это основано на данных примера @Jon Spring, но использует tidyr::complete, чтобы убедиться, что все уровни факторов в интересующем столбце (здесь Species) явно отсутствуют, а не явно отсутствуют (то есть существуют и имеют NA ипоэтому будет включен в условные обозначения).

Это лучше, чем использовать все данные, так как построение прозрачных данных может быть медленным, это также означает, что пределы оси задаются данными, которые вы наносите, а не всемdata.frame.

iris_s %>% tidyr::complete(Species) %>% 
ggplot(., aes(Sepal.Width, Sepal.Length, color = Species)) +
  geom_point() +
  scale_color_manual(values = c("setosa" = "#DBA92A", 
                            "versicolor" = "#3D5A5C", 
                            "virginica" = "#CF5423"))
0 голосов
/ 01 октября 2019

Вот подход, который может работать для ваших данных: добавьте слой, данные которого имеют все результаты, но скройте слой, сделав его прозрачным (alpha = 0), сделав его значения NA и т. Д.

iris_s <- subset(iris, Species == "setosa")
ggplot(iris_s, aes(Sepal.Width, Sepal.Length, color = Species)) +
  geom_point() +
  scale_color_manual(values = c("setosa" = "#DBA92A", 
                                "versicolor" = "#3D5A5C", 
                                "virginica" = "#CF5423")) +
  # Either of these should work
  # geom_point(data = iris, alpha = 0) +
  geom_point(data = dplyr::mutate(iris, Sepal.Width = NA_real_))

enter image description here

...