如果尝试以编程方式设置轴标签的字体外观,则一个过程在没有构面的情况下工作,但在构面存在时中断。例如
library(tidyverse)
library(magrittr)
data("mtcars")
mtcars %<>%
rownames_to_column %>%
mutate(
rowname = rowname %>%
fct_reorder(mpg)
)
p1 <- mtcars %>%
ggplot(
aes(mpg, rowname)
) +
geom_point() +
theme(
axis.text.y = element_text(
face = c("plain", "bold") %>%
rep(c(30, 2))
)
)
p1
返回
但是如果我添加facet,这种普通和粗体y轴标签的模式就会丢失
p1 +
facet_grid(
cyl ~ .,
scales = "free_y",
space = "free_y"
)
如何在有facet_grid
?
答案 0 :(得分:2)
这是一种解决方法,但在您的情况下实现它应该没有问题。我玩弄了一下,并且在数据集中创建一个实际的字体变量并使用数字而不是c("plain", "bold")
更好。
library(tidyverse)
library(magrittr)
data("mtcars")
mtcars %<>%
rownames_to_column %>%
mutate(
rowname = rowname %>%
fct_reorder(mpg)
)
mtcars$font_face <- rep(c(1,2,3,4))
p1 <- mtcars %>%
ggplot(aes(mpg, rowname)) +
geom_point() +
theme(axis.text.y = element_text(face = mtcars$font_face)) +
facet_grid(cyl ~ .,
scales = "free_y",
space = "free_y")
p1
如您所见,四个面的位置是斜体= 1,粗体= 2,平坦= 3,粗体= 4。
因此,要重新创建示例,您只需要在原始数据管道中生成一个变量,并使用任何相关方法进行分配。要明确地重新创建您的示例,我将使用以下代码,但我假设您将需要处理实际适合您的用例的dplyr解决方案。
mtcars$font_face <- ifelse(mtcars$rowname %in% c("Toyota Corolla", "Fiat 128"), 2, 3)
最终解决方案目前无效(ifelse
行)。它识别else
值并在1:4
中选择成功更改应用于标签的效果,但它不会选择更改if
值的标签,尽管事实{ {1}}变量确实采用了这些值。
我现在陷入困境,因为我无法弄清楚为什么之前为我跑,而不是在一个新的会议上。我仍然在努力弄清楚自己,但也许我的开始可以帮助某人进入下一步。
答案 1 :(得分:0)
这个问题有一个hacky的答案,但似乎对你的问题很有效:ggplot2: Coloring axis text on a faceted plot。
为了使这个问题适应您的问题,我们必须将假轴移动到y轴并调整设置,使其与您的数据标签看起来很好。
library(tidyverse)
library(magrittr)
data("mtcars")
mtcars %<>%
rownames_to_column %>%
mutate(
rowname = rowname %>%
fct_reorder(mpg),
font_face = as.factor(if_else(rowname %in% c("Toyota Corolla", "Fiat 128"), 'bold', 'plain'))
)
mtcars %>%
ggplot(aes(mpg, rowname)) +
geom_point() +
facet_grid(cyl ~ .,
scales = "free_y",
space = "free_y") +
# make space to accommodate the fake axis
expand_limits(x = -5) +
# create a strip of white background under the fake axis
geom_rect(xmin = -20, xmax = 0, ymin = 0, ymax = nrow(mtcars) + 1, fill = "white") +
# fake axis layer
geom_text(aes(fontface = font_face, label = rowname), x = -.2, vjust = .5, hjust = 1, size = 3) +
# hide the actual axis text / ticks
theme(axis.text.y = element_blank(), axis.ticks.y = element_blank())