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:]*"))])

-输出