ggplot:应用函数后用命名向量修改轴标签
ggplot: modify axis labels with named vector after having applied function
我有一个关于在 ggplot 中修改轴标签的问题。我知道我想要达到的目标可以通过其他方式完成(例如,使用 case_when
创建一个新列)。我感兴趣的是下面概述的 approach/concept。
假设我在 x 轴上有一个离散变量。为了获得所需的轴标签,值被 1) 用函数修改,然后 2) 通过将命名向量中包含的值分配给函数的结果来更改。我能够单独执行这两个步骤中的每一个;但它们如何结合呢?这能做到吗?
同样,我知道还有其他可能更明智的方法可以做到这一点。下面的例子没有任何实质意义。我很好奇 whether/how 这可以直接在例如scales_x_discrete
函数。下面我试图详细说明我的意思。结果将是所有 Merc
标签变为 Mercedes
,并且 Hornet
的所有实例变为 Super Hornet
。
library(tidyverse)
labeller_cars <- c("Hornet"="Super Hornet",
"Merc"="Mercedes")
mtcars %>%
rownames_to_column(var = "name") %>%
filter(str_detect(name, regex("Hornet|Merc"))) %>%
ggplot()+
geom_bar(aes(x=name,
y=disp),
stat="identity")+
#here is what I am interested in; this works, but it's only first step
scale_x_discrete(labels=function(x) str_extract(x, regex("[:alpha:]*")))
#this is an attempt, but doesn't work.
# scale_x_discrete(labels=function(x) str_extract(x, regex("[:alpha:]*")) %>% labeller_cars)
由 reprex package (v2.0.0)
于 2021-07-24 创建
我们可以使用 str_replace_all
而不是 str_extract
library(dplyr)
library(stringr)
library(ggplot2)
labeller_cars <- c(".*Hornet.*"="Super Hornet",
".*Merc.*"="Mercedes")
mtcars %>%
rownames_to_column(var = "name") %>%
filter(str_detect(name, regex("Hornet|Merc"))) %>%
ggplot()+
geom_bar(aes(x=name,
y=disp),
stat="identity")+
#here is what I am interested in; this works, but it's only first step
scale_x_discrete(labels=function(x) str_replace_all(x, labeller_cars)) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
-输出
或者用str_extract
,提取子串后,使用命名向量匹配替换
labeller_cars <- c("Hornet"="Super Hornet",
"Merc"="Mercedes")
mtcars %>%
rownames_to_column(var = "name") %>%
filter(str_detect(name, regex("Hornet|Merc"))) %>%
ggplot()+
geom_bar(aes(x=name,
y=disp),
stat="identity")+
scale_x_discrete(labels=function(x)
labeller_cars[str_extract(x, regex("[:alpha:]*"))])
-输出
我有一个关于在 ggplot 中修改轴标签的问题。我知道我想要达到的目标可以通过其他方式完成(例如,使用 case_when
创建一个新列)。我感兴趣的是下面概述的 approach/concept。
假设我在 x 轴上有一个离散变量。为了获得所需的轴标签,值被 1) 用函数修改,然后 2) 通过将命名向量中包含的值分配给函数的结果来更改。我能够单独执行这两个步骤中的每一个;但它们如何结合呢?这能做到吗?
同样,我知道还有其他可能更明智的方法可以做到这一点。下面的例子没有任何实质意义。我很好奇 whether/how 这可以直接在例如scales_x_discrete
函数。下面我试图详细说明我的意思。结果将是所有 Merc
标签变为 Mercedes
,并且 Hornet
的所有实例变为 Super Hornet
。
library(tidyverse)
labeller_cars <- c("Hornet"="Super Hornet",
"Merc"="Mercedes")
mtcars %>%
rownames_to_column(var = "name") %>%
filter(str_detect(name, regex("Hornet|Merc"))) %>%
ggplot()+
geom_bar(aes(x=name,
y=disp),
stat="identity")+
#here is what I am interested in; this works, but it's only first step
scale_x_discrete(labels=function(x) str_extract(x, regex("[:alpha:]*")))
#this is an attempt, but doesn't work.
# scale_x_discrete(labels=function(x) str_extract(x, regex("[:alpha:]*")) %>% labeller_cars)
由 reprex package (v2.0.0)
于 2021-07-24 创建我们可以使用 str_replace_all
而不是 str_extract
library(dplyr)
library(stringr)
library(ggplot2)
labeller_cars <- c(".*Hornet.*"="Super Hornet",
".*Merc.*"="Mercedes")
mtcars %>%
rownames_to_column(var = "name") %>%
filter(str_detect(name, regex("Hornet|Merc"))) %>%
ggplot()+
geom_bar(aes(x=name,
y=disp),
stat="identity")+
#here is what I am interested in; this works, but it's only first step
scale_x_discrete(labels=function(x) str_replace_all(x, labeller_cars)) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
-输出
或者用str_extract
,提取子串后,使用命名向量匹配替换
labeller_cars <- c("Hornet"="Super Hornet",
"Merc"="Mercedes")
mtcars %>%
rownames_to_column(var = "name") %>%
filter(str_detect(name, regex("Hornet|Merc"))) %>%
ggplot()+
geom_bar(aes(x=name,
y=disp),
stat="identity")+
scale_x_discrete(labels=function(x)
labeller_cars[str_extract(x, regex("[:alpha:]*"))])
-输出