以编程方式在ggplots中设置轴面

时间:2018-05-17 14:50:55

标签: r ggplot2 tidyverse

如果尝试以编程方式设置轴标签的字体外观,则一个过程在没有构面的情况下工作,但在构面存在时中断。例如

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

返回

plain and bold labels

但是如果我添加facet,这种普通和粗体y轴标签的模式就会丢失

p1 + 
  facet_grid(
    cyl ~ .,
    scales = "free_y",
    space = "free_y"
    ) 

no plain and bold labels

如何在有facet_grid

的情况下加入一些标签

2 个答案:

答案 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

enter image description here

如您所见,四个面的位置是斜体= 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())

Plot with appropriate row labels shown in bold