Facet_wrap:基于label_value的条件格式?

Facet_wrap: conditional formatting based on label_value?

对于我的一些图表,我想根据方面的标签有条件地更改每个方面的 x 轴上数字的格式,例如基于数量级(例如 k、M、B 等)。

在下面使用 mtcars 数据的示例中,我希望 gear==3 的方面保留原始数字,gear==4 创建 "k" 格式并使用 gear==5 和 "M" 格式。这样后两者就分别用千和百万表示了。

是否可以使用 labeller 中的 label_value 有条件地应用 format/function?

library(tidyverse)

d<-mtcars%>%mutate(mpg2=ifelse(gear==5,mpg*1000000,mpg))

ggplot(d) +
      geom_point(aes(mpg2, cyl)) +
      facet_wrap(~ gear, scales = "free")+
      scale_x_continuous(name = NULL,  labels = function(l) {
          return(paste0(round(l / 1000, 1), "K"))
      })

如果您希望比例格式根据值而变化,可以使用 dplyr::case_when。 (不过,我不知道如何根据方面以不同方式显示相同的数字。)

编辑以在示例中显示更宽的范围:

d <- mtcars %>% mutate(mpg2 = mpg ^ gear / carb)


ggplot(d) +
  geom_point(aes(mpg2, cyl)) +
  facet_wrap(~ gear, scales = "free")+
  scale_x_continuous(name = NULL,  trans = "log2", labels = function(l) {
     scaled = case_when(l >= 1E6 ~ paste0(formatC(l/1E6, digits = 0, big.mark = ",", format = "f"), "M"),
                        l >= 1E3 ~ paste0(formatC(l/1E3, digits = 0, big.mark = ",", format = "f"), "K"),
                        TRUE     ~ paste0(l))
     return(scaled)
})

我觉得效果很好。

如果您需要对分面标签进行特定控制,您可以考虑使用 geom_text(aes(label = your_preferred_label)) 伪造分面轴文本并在 coord_ 中关闭裁剪,以便将文本放在绘图范围之外,或者(更简单地说)将图与 patchworkcowplot 结合起来。我不知道有什么方法可以让贴标机本身知道方面信息。