Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I change the background color of a plot made with ggplot2

Tags:

r

ggplot2

By default, ggplot2 produces plots with a grey background. How do I change the color of the background of the plot?

For example, a plot produced by the following code:

library(ggplot2) myplot<-ggplot(data=data.frame(a=c(1,2,3), b=c(2,3,4)), aes(x=a, y=b)) + geom_line() myplot 
like image 842
Jack Edmonds Avatar asked Jul 18 '11 16:07

Jack Edmonds


2 Answers

To change the panel's background color, use the following code:

myplot + theme(panel.background = element_rect(fill = 'green', colour = 'red')) 

To change the color of the plot (but not the color of the panel), you can do:

myplot + theme(plot.background = element_rect(fill = 'green', colour = 'red')) 

See here for more theme details Quick reference sheet for legends, axes and themes.

like image 57
Jack Edmonds Avatar answered Sep 21 '22 19:09

Jack Edmonds


To avoid deprecated opts and theme_rect use:

myplot + theme(panel.background = element_rect(fill='green', colour='red')) 

To define your own custom theme, based on theme_gray but with some of your changes and a few added extras including control of gridline colour/size (more options available to play with at ggplot2.org):

theme_jack <- function (base_size = 12, base_family = "") {     theme_gray(base_size = base_size, base_family = base_family) %+replace%          theme(             axis.text = element_text(colour = "white"),             axis.title.x = element_text(colour = "pink", size=rel(3)),             axis.title.y = element_text(colour = "blue", angle=45),             panel.background = element_rect(fill="green"),             panel.grid.minor.y = element_line(size=3),             panel.grid.major = element_line(colour = "orange"),             plot.background = element_rect(fill="red")     )    } 

To make your custom theme the default when ggplot is called in future, without masking:

theme_set(theme_jack()) 

If you want to change an element of the currently set theme:

theme_update(plot.background = element_rect(fill="pink"), axis.title.x = element_text(colour = "red")) 

To store the current default theme as an object:

theme_pink <- theme_get() 

Note that theme_pink is a list whereas theme_jack was a function. So to return the theme to theme_jack use theme_set(theme_jack()) whereas to return to theme_pink use theme_set(theme_pink).

You can replace theme_gray by theme_bw in the definition of theme_jack if you prefer. For your custom theme to resemble theme_bw but with all gridlines (x, y, major and minor) turned off:

theme_nogrid <- function (base_size = 12, base_family = "") {     theme_bw(base_size = base_size, base_family = base_family) %+replace%          theme(             panel.grid = element_blank()     )    } 

Finally a more radical theme useful when plotting choropleths or other maps in ggplot, based on discussion here but updated to avoid deprecation. The aim here is to remove the gray background, and any other features that might distract from the map.

theme_map <- function (base_size = 12, base_family = "") {     theme_gray(base_size = base_size, base_family = base_family) %+replace%          theme(             axis.line=element_blank(),             axis.text.x=element_blank(),             axis.text.y=element_blank(),             axis.ticks=element_blank(),             axis.ticks.length=unit(0.3, "lines"),             axis.ticks.margin=unit(0.5, "lines"),             axis.title.x=element_blank(),             axis.title.y=element_blank(),             legend.background=element_rect(fill="white", colour=NA),             legend.key=element_rect(colour="white"),             legend.key.size=unit(1.2, "lines"),             legend.position="right",             legend.text=element_text(size=rel(0.8)),             legend.title=element_text(size=rel(0.8), face="bold", hjust=0),             panel.background=element_blank(),             panel.border=element_blank(),             panel.grid.major=element_blank(),             panel.grid.minor=element_blank(),             panel.margin=unit(0, "lines"),             plot.background=element_blank(),             plot.margin=unit(c(1, 1, 0.5, 0.5), "lines"),             plot.title=element_text(size=rel(1.2)),             strip.background=element_rect(fill="grey90", colour="grey50"),             strip.text.x=element_text(size=rel(0.8)),             strip.text.y=element_text(size=rel(0.8), angle=-90)          )    } 
like image 27
Silverfish Avatar answered Sep 17 '22 19:09

Silverfish