ggplot2:仅显示一组中的文本标签

Sea*_*n G 4 r ggplot2

我的设置:

我有一些篮球运动员和他们的统计数据。

library(tidyverse)

df <- tibble(
  season = c(2010, 2011, 2012, 2013, 2014,
             2010, 2011, 2012, 2013, 2014),
  player = c("player_a", "player_a", "player_a", "player_a", "player_a",
             "league_avg", "league_avg", "league_avg", "league_avg", "league_avg"),
  fg_perc = c(.4912, .6083, .3095, .5525, .4289,
              .4825, .4836, .4819, .4860, .4848),
  points_game = c(20, 18, 15, 19, 18,
                  12, 12, 13, 11, 12)
)
Run Code Online (Sandbox Code Playgroud)

我已经将某个列 (fg_perc) 显示为 player_a 和 League_avg 的 geom_line()。我还将它包装在一个自定义函数中,因为我将对其他统计数据使用相同的方法。

make_chart <- function(target_column) {
  df %>% 
    ggplot(aes_string("season", target_column, label = target_column)) + 
    geom_line(aes(color = player), size = 1.33)
}

make_chart("fg_perc")
Run Code Online (Sandbox Code Playgroud)

我的问题:

我只想将 fg_perc 值显示为 player_a 数据的百分比。如果不消除图例(当我传播()league_avg 时),我无法弄清楚如何做到这一点。我正在寻找一种解决方案,它也能够保持非百分比数字原样,并以类似的方式显示它们(例如,仅针对 player_a 的 points_game)。输出看起来像这样(请原谅 MS Paint):

在此处输入图片说明

谢谢!

Oma*_*maS 5

检查一下:您可以在 geom_text 中使用 ifelse 设置您的条件:

  • 如果玩家==感兴趣的玩家,标签将是 % 值

  • 否则,标签将为空“”

你可以在任何你想要的条件下,或多个玩家。

df %>% 
        ggplot(aes(season,fg_perc))+
        geom_line(aes(color = player), size = 1.33)+
        geom_text(aes(label=ifelse(player=="player_a",paste0(100*fg_perc,"%")," ")))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

编辑

如果你想换行代码的功能,你可以尝试使用以下,在您使用aes_stringgeom_text能够通过列名作为字符串。

如果您的所有目标列都是百分比:

  • 您可以在函数内部提前将列乘以 100 (或在传递 df 之前进行变异)

    make_chart <- function(target_column) {
    
        df[,target_column] <- 100*df[,target_column]
    
        df %>% 
                ggplot(aes_string("season", target_column)) + 
                geom_line(aes(color = player), size = 1.33) +
                geom_text(data=filter(df,player=="player_a"),
                          aes_string(label=target_column))+
                # a work around to add the % sign
                geom_text(data=filter(df,player=="player_a"),
                          aes(label="%"),
                          hjust=-1.5) }
    
    Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 感谢您的反馈。添加了一个简单的解释。 (2认同)

Jak*_*upp 1

如果您想make_chart在不进行硬编码的情况下使用函数,则需要使用非标准评估 (nse)。许多tidyverse函数都有 nse 版本,由_函数名称后面的 表示。如果您以编程方式使用这些版本,则可以使用它们。

下面是使用 nse 版本的aesand filteraes_and的粗略示例filter_。使用 nse 构建函数的内容比我在这里所做的要多得多。我建议您阅读nse 上的 dplyr vignette了解更多信息。

我只是复制了 @OmaymaS 提供的解决方案,使用的是filter_而不是ifelse. 我还冒昧地.data向您的函数添加了一个数据参数以及一个player_highlight参数。可以.data让您的函数可通过管道传输,并且player_highight可以让您选择要突出显示的玩家(因为他们可能不止一个)。您很可能想要扩展功能,并且应该这样做!

library(tidyverse)

df <- data_frame(
  season = c(2010, 2011, 2012, 2013, 2014,
             2010, 2011, 2012, 2013, 2014),
  player = c("player_a", "player_a", "player_a", "player_a", "player_a",
             "league_avg", "league_avg", "league_avg", "league_avg", "league_avg"),
  fg_perc = c(.4912, .6083, .3095, .5525, .4289,
              .4825, .4836, .4819, .4860, .4848),
  points_game = c(20, 18, 15, 19, 18,
                  12, 12, 13, 11, 12)
)


make_chart <- function(.data, target_column, player_highlight) {
    ggplot(.data, aes_(x = ~season, y = as.name(target_column))) + 
    geom_line(aes_(color = ~player), size = 1.33) +
    geom_text(data = filter_(.data, ~ player == player_highlight), aes_(label = as.name(target_column)))
}

make_chart(df,"fg_perc","player_a")

df %>% 
  make_chart("fg_perc","player_a")
Run Code Online (Sandbox Code Playgroud)