Программно установить грань оси в ggplots с фасетами - PullRequest
0 голосов
/ 17 мая 2018

Если попытаться программно установить грань шрифта для меток оси, один процесс работает при отсутствии фасетов, но прерывается при наличии фасетов.Например,

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

Но если я добавлю фасеты, этот шаблон простых и полужирных меток по оси Y будетпотерян

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

no plain and bold labels

Как я могу подбодрить некоторые ярлыки в присутствии facet_grid?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Этот вопрос имеет хакерский ответ, который, тем не менее, кажется, хорошо работает для вашей проблемы: ggplot2: Раскраска текста по оси на граненом графике .

Чтобы приспособить это к вашей проблеме, мы имеемчтобы переместить фиктивную ось на ось 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

0 голосов
/ 17 мая 2018

Это немного обходной путь, но у вас не должно возникнуть проблем с его внедрением в вашем случае.Я немного поиграл с этим, и мне повезло, создав реальную переменную fontface прямо в наборе данных и используя цифры вместо 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 и жирным шрифтом.italic = 4.

Итак, чтобы воссоздать пример, который вы представили, вам просто нужно сгенерировать переменную в исходном канале данных и назначить ее любым подходящим способом.Чтобы воссоздать ваш пример явно, я бы пошел со следующим кодом, но я предполагаю, что вы захотите разработать решение dplyr, которое действительно соответствует вашему варианту использования.

mtcars$font_face <- ifelse(mtcars$rowname %in% c("Toyota Corolla", "Fiat 128"), 2, 3)

edit:

Окончательное решение в настоящее время не работает (строка ifelse).Он распознает значение else и выбор из 1:4 успешно изменяет эффект, примененный к меткам, но не выбирает изменение меток для значений if, несмотря на то, что переменная mtcars$font_face принимаетэти ценности.

Я застрял в данный момент, потому что я не могу понять, почему это работало для меня раньше, но не на новом сеансе.Я все еще работаю над тем, чтобы понять это сам, но, возможно, мое начало поможет кому-то перейти к следующему шагу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...