我的设置:
我有一些篮球运动员和他们的统计数据。
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):
谢谢!
检查一下:您可以在 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_string内geom_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)如果您想make_chart在不进行硬编码的情况下使用函数,则需要使用非标准评估 (nse)。许多tidyverse函数都有 nse 版本,由_函数名称后面的 表示。如果您以编程方式使用这些版本,则可以使用它们。
下面是使用 nse 版本的aesand filter、aes_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)