Условное изменение семейства шрифтов axis.text и размера шрифта создает нежелательный «пробел» - PullRequest
3 голосов
/ 15 января 2020

Мне нужно изменить семейство и размер заданного c элемента оси x барплота, основываясь на условии.

Я могу успешно изменить лицо , используя:

library(ggplot2)
ggplot(iris, aes(Species, Petal.Length)) + 
  geom_boxplot() + 
  coord_flip() +
  theme(axis.text.y = element_text(face = ifelse(levels(iris$Species)=="setosa","bold","italic")))

Как предложено: { ссылка }

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

ggplot(iris, aes(Species, Petal.Length)) + 
  geom_boxplot() + coord_flip() + 
  theme(axis.text.y = element_text(family = ifelse(levels(iris$Species)=="setosa","sans","mono")))

или

ggplot(iris, aes(Species, Petal.Length)) + 
  geom_boxplot() + coord_flip() + 
  theme(axis.text.y = element_text(size = ifelse(levels(iris$Species)=="setosa", 10, 20)))

Я пытаюсь отредактировать его, используя margin , но при изменении имен может возникнуть наложение (например, с помощью блестящего приложения).

Что это за пробел? Могу ли я удалить его?

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Проблема исправлена ​​в следующем ggplot2 3.3.0, но теперь он вызывает предупреждение, потому что такой подход к форматированию текста оси ненадежен и может перестать работать в любой точке в будущем.

library(ggplot2) # v 3.3.0 or higher

# discouraged, triggers warning message
ggplot(iris, aes(Species, Petal.Length)) + 
  geom_boxplot() + coord_flip() + 
  theme(
    axis.text.y = element_text(
      size = ifelse(levels(iris$Species)=="setosa", 10, 20)
    )
  )
#> Warning: Vectorized input to `element_text()` is not officially supported.
#> Results may be unexpected or may change in future versions of ggplot2.

В качестве альтернативы разрабатываемый пакет ggtext пытается обеспечить принципиальный подход к этой проблеме путем кодирования инструкций форматирования в текстовые метки.

library(ggtext) # remotes::install_github("clauswilke/ggtext")
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(glue)
#> 
#> Attaching package: 'glue'
#> The following object is masked from 'package:dplyr':
#> 
#>     collapse

iris %>%
  mutate(
    Species = ifelse(
      Species == "setosa",
      "<span style = 'font-size:10pt'>setosa</span>",
      glue("<span style = 'font-size:20pt'>{Species}</span>")
    )
  ) %>%
  ggplot(aes(Species, Petal.Length)) + 
  geom_boxplot() + coord_flip() + 
  theme(axis.text.y = element_markdown())

Создано в 2020-01-16 с помощью пакета prepx (v0.3.0)

1 голос
/ 16 января 2020

Понятия не имею, почему это происходит. Очень своеобразно. Но вы можете изменить это поле с помощью margin.
Однако вам необходимо указать единицу измерения, например, в дюймах. Таким образом, это правильный метод проб и ошибок, чтобы найти правильные значения, это также будет сильно зависеть от вашего окончательного вывода графика.
Может быть, было бы безопаснее и проще найти различные способы выделения ваших данных?

library(ggplot2)

ggplot(iris, aes(Species, Petal.Length)) + 
  geom_boxplot() + 
  theme(axis.text.y = element_text(family =  
          ifelse(levels(iris$Species)=="setosa","sans","mono"),
        margin = margin(r = -2, l = 0.8, unit = 'in'))) +
  coord_flip()

Создано в 2020-01-15 пакетом Представить (v0.3.0)

...