即使图表中未显示类别,也显示整个图例

Show entire legend even when a category is not displayed in the graph

我正在制作一张图表来显示棒球运动员的击球模式。
网格上的位置对应于球被击中的位置,圆圈的颜色对应于结果(单打、双打、三打、本垒 运行、出局、牺牲飞球)。

我正在为多个玩家重复此图表,但并非所有玩家在所有类别中都有成功。

我确保结果用相同的颜色标记(否则如果主场 运行 一位玩家的主场 运行 是绿色而另一位玩家的出局是绿色会造成混淆)。

我想展示一个图例,其中包括所有结果(单一、双重、三重等),即使对于没有绘制所有这些结果的图表也是如此。对于查看此内容的人来说,识别特定玩家没有家 运行 是很有用的。

关于我遗漏了什么有什么想法吗?

#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()
  )

这是一种可能适用于您的数据的方法:添加一个层,其数据包含所有结果,但通过使其透明 (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_))

这基于@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"))