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_
中关闭裁剪,以便将文本放在绘图范围之外,或者(更简单地说)将图与 patchwork
或 cowplot
结合起来。我不知道有什么方法可以让贴标机本身知道方面信息。
对于我的一些图表,我想根据方面的标签有条件地更改每个方面的 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_
中关闭裁剪,以便将文本放在绘图范围之外,或者(更简单地说)将图与 patchwork
或 cowplot
结合起来。我不知道有什么方法可以让贴标机本身知道方面信息。