Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change geom default aesthetics as part of theme component only

Tags:

r

ggplot2

themes

For a custom ggplot2 theme I'd like to change the default aesthetic of some geom, say I want red dots instead of black dots.

From this answer I know we can change defaults for a geom using the function update_geom_default but I wonder if it is possible to change the colour only when we call theme_red_dots?

Example of my naive attempt:

library(ggplot2)

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

Looks good here:

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

enter image description here

But I'd like the points to be black again when I call

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

enter image description here

Thanks in advance!


Below is an example of why I thought this could be useful. We can change panel.background to be black fairly easy but this would make it impossible to see the points if we don't map an aesthetic to colour. (The usefulness of this theme_black can certainly be discussed, but I would like to avoid an argument about that.)

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

Changing the colour of the points inside geom_point() is an option here (see @zx8754 answer), but this requires the user of theme_black() to change it, while I am wondering if there is a way to do this right inside theme_*.

like image 800
markus Avatar asked Jan 09 '19 09:01

markus


People also ask

Which function can I use to modify the elements of a theme in Ggplot?

Modify a single plot's theme using theme() ; see theme_update() if you want modify the active theme, to affect all subsequent plots. Use the themes available in complete themes if you would like to use a complete theme such as theme_bw() , theme_minimal() , and more.

What does the alpha argument of geom_ point() do?

What does Alpha do in Geom_point? Alpha refers to the opacity of a geom. Values of alpha range from 0 to 1, with lower values corresponding to more transparent colors.

What are themes in R?

Themes are a powerful way to customize the non-data components of your plots: i.e. titles, labels, fonts, background, gridlines, and legends. Themes can be used to give plots a consistent customized look.


2 Answers

Another solution is to detach and reattach ggplot2 (apparently you can do this within custom ggplot2 theme function).

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

Works with wanted theme_black too:

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()
like image 163
pogibas Avatar answered Oct 22 '22 08:10

pogibas


The released version of ggplot2 doesn't currently offer a way to do this. However, this is a fairly old feature request and has been under development since the summer of 2018.

like image 3
Mikko Marttila Avatar answered Oct 22 '22 07:10

Mikko Marttila