Изменять эстетику geom по умолчанию как часть компонента темы - PullRequest
0 голосов
/ 09 января 2019

Для пользовательской темы ggplot2 я бы хотел изменить эстетику по умолчанию для некоторого geom, скажем, я хочу красные точки вместо черных точек.

Из этого ответа Я знаю, что мы можем изменить значения по умолчанию для geom, используя функцию update_geom_default, но мне интересно, возможно ли изменить цвет только при вызове theme_red_dots?

Пример моей наивной попытки:

library(ggplot2)

theme_red_dots <- function(...) {
  update_geom_defaults("point", list(colour = "red"))
  theme_minimal() +
    theme(...)
}

Хорошо выглядит здесь:

ggplot(mtcars, aes(mpg, disp)) + 
  geom_point() + 
  theme_red_dots()

enter image description here

Но я бы хотел, чтобы точки снова были черными, когда я звоню

ggplot(mtcars, aes(mpg, disp)) + 
  geom_point()

enter image description here

Заранее спасибо!


Ниже приведен пример того, почему я подумал, что это может быть полезно. Мы можем изменить panel.background на черный довольно легко, но это не позволит увидеть точки, если мы не сопоставим эстетику с цветом. (Полезность этого theme_black, безусловно, можно обсудить, но я бы хотел избежать спора об этом.)

theme_black <- function(...) {
  theme_minimal() +
    theme(panel.background = element_rect(fill = "black")) +
    theme(...)
}

# update_geom_defaults("point", list(colour = "black"))
ggplot(mtcars, aes(mpg, disp)) + 
  geom_point() + 
  theme_black()

enter image description here

Изменение цвета точек внутри geom_point() является вариантом здесь (см. Ответ @ zx8754), но для этого требуется, чтобы пользователь theme_black() изменил его, хотя мне интересно, есть ли способ сделать это правильно внутри theme_*.

Ответы [ 4 ]

0 голосов
/ 02 февраля 2019

Поскольку моя репутация не позволяет мне комментировать:

@ PoGibas: Проблема отсоединения и повторного присоединения ggplot2 заключается в том, что если загружены другие пакеты, которые требуют этого, например, rstan, он не будет работать и вернет ошибку.

0 голосов
/ 11 января 2019

В выпущенной версии ggplot2 в настоящее время нет способа сделать это. Однако это довольно старый запрос , и с лета 2018 г. находится в разработке *1006*.

0 голосов
/ 14 января 2019

Другим решением является отсоединение и повторное подключение ggplot2 (очевидно, вы можете сделать это в пользовательской функции темы ggplot2).

library(ggplot2)

theme_red_dots <- function(...) {
    # wanted theme
    update_geom_defaults("point", list(colour = "red"))

    # Plot
    p <- theme_minimal() + 
        theme(...)

    # Detach and reattach ggplot2
    detach("package:ggplot2", unload = TRUE); library(ggplot2)

    # Return wanted plot
    return(p)
}
# red dots
ggplot(mtcars, aes(mpg, disp)) + 
    geom_point() + 
    theme_red_dots()
# black (default) dots
ggplot(mtcars, aes(mpg, disp)) + 
    geom_point()

Работает с разыскиваемым theme_black тоже:

theme_black <- function(...) {
    update_geom_defaults("point", list(colour = "red"))
    p <- theme_minimal() +
        theme(panel.background = element_rect(fill = "black")) +
        theme(...)
    detach("package:ggplot2", unload = TRUE); library(ggplot2)
    return(p)
}

# Plots with black background
ggplot(mtcars, aes(mpg, disp)) + 
    geom_point() + 
    theme_black()

# Plots with default background
ggplot(mtcars, aes(mpg, disp)) + 
    geom_point()
0 голосов
/ 09 января 2019

Вместо изменения значений по умолчанию настройте geom_point :

library(ggplot2)

# make custom geom with red as default
geom_point_red <- function()geom_point(col = "red")

ggplot(mtcars, aes(mpg, disp)) + 
  geom_point_red()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...