9 votes

Modification de l'esthétique par défaut de geom dans le cadre du composant de thème uniquement

Pour un ggplot2 j'aimerais modifier l'esthétique par défaut de certains éléments du thème geom Disons que je veux des points rouges au lieu de points noirs.

De cette réponse Je sais que l'on peut modifier les valeurs par défaut d'une geom en utilisant la fonction update_geom_default mais je me demande s'il est possible de changer la couleur uniquement lorsque nous appelons theme_red_dots ?

Exemple de ma tentative naïve :

library(ggplot2)

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

Ça a l'air bien ici :

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

enter image description here

Mais j'aimerais que les points soient à nouveau noirs quand j'appelle

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

enter image description here

Merci d'avance !


Vous trouverez ci-dessous un exemple des raisons pour lesquelles j'ai pensé que cela pourrait être utile. Nous pouvons changer panel.background pour être noir assez facilement mais cela rendrait impossible de voir les points si nous ne faisons pas correspondre une esthétique à une couleur. (L'utilité de cette theme_black peut certainement être discutée, mais je voudrais éviter un débat à ce sujet).

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

Changer la couleur des points à l'intérieur geom_point() est une option ici (voir la réponse de @zx8754), mais cela nécessite l'utilisation de theme_black() pour le changer, alors que je me demande s'il y a un moyen de le faire directement à l'intérieur de theme_* .

4voto

Pgibas Points 677

Une autre solution consiste à détacher et rattacher ggplot2 (apparemment, vous pouvez le faire dans le cadre de la personnalisation ggplot2 fonction thématique).

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()

Fonctionne avec les souhaits theme_black aussi :

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()

3voto

zx8754 Points 13573

Au lieu de modifier les valeurs par défaut, faites des géom_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()

3voto

Mikko Marttila Points 3262

La version publiée de ggplot2 n'offre pas actuellement un moyen de le faire. Cependant, c'est une demande de fonctionnalité assez ancienne et a été en cours de développement depuis l'été 2018.

2voto

andreas Points 21

Ma réputation ne me permet pas de commenter :

@PoGibas : Une question sur le détachement et le rattachement ggplot2 c'est que si d'autres paquets sont chargés qui le nécessitent, par ex. rstan il ne fonctionnera pas et renverra une erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X