¿Cómo cambio el color de fondo de un gráfico realizado con ggplot2?

95

De forma predeterminada, ggplot2 produce gráficos con un fondo gris. ¿Cómo cambio el color del fondo del gráfico?

Por ejemplo, un gráfico producido por el siguiente código:

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
Jack Edmonds
fuente

Respuestas:

120

Para cambiar el color de fondo del panel, use el siguiente código:

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

Para cambiar el color del gráfico (pero no el color del panel), puede hacer:

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

Consulte aquí para obtener más detalles sobre el tema. Hoja de referencia rápida para leyendas, ejes y temas .

Jack Edmonds
fuente
39
También está el theme_bw, que le da un fondo blanco y líneas de cuadrícula grises. Lo uso todo el tiempo, ya que en la impresión se ve mucho mejor que el fondo gris predeterminado:myplot + theme_bw()
ROLO
@ROLO: ¡Bien! ¿Hay alguna forma de aplicar esto a todos los gráficos de forma predeterminada?
krlmlr
11
Ponga esto al principio de su script para ggplots en blanco y negro predeterminados: ggplot <- function(...) { ggplot2::ggplot(...) + theme_bw() }
ROLO
1
@ROLO que merece su propia respuesta, especialmente porque la respuesta de Jack no cambia el color de las líneas de la cuadrícula.
naught101
7
Tenga en cuenta que optsy theme_rectestán en desuso en las versiones más recientes de ggplot2. (0.9.3). Entonces, la versión más nueva del segundo comando se convertiría en:myplot + theme(plot.background = element_rect(fill='green', colour='red'))
Ram Narasimhan
50

Para evitar el uso optsy obsoleto theme_rect:

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

Para definir su propio tema personalizado, basado en theme_gray pero con algunos de sus cambios y algunos extras adicionales, incluido el control del color / tamaño de la línea de cuadrícula (más opciones disponibles para jugar en 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")
    )   
}

Para que su tema personalizado sea el predeterminado cuando se llame a ggplot en el futuro, sin enmascaramiento:

theme_set(theme_jack())

Si desea cambiar un elemento del tema establecido actualmente:

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

Para almacenar el tema predeterminado actual como un objeto:

theme_pink <- theme_get()

Tenga en cuenta que theme_pinkes una lista mientras que theme_jackera una función. Entonces, para devolver el tema al uso de theme_jack, theme_set(theme_jack())mientras que para volver al uso de theme_pink theme_set(theme_pink).

Puede reemplazar theme_graypor theme_bwen la definición de theme_jacksi lo prefiere. Para que su tema personalizado se parezca theme_bwpero con todas las líneas de cuadrícula (x, y, mayor y menor) desactivadas:

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

Finalmente, un tema más radical útil al trazar coropletas u otros mapas en ggplot, basado en la discusión aquí, pero actualizado para evitar su desaprobación. El objetivo aquí es eliminar el fondo gris y cualquier otra característica que pueda distraer la atención del mapa.

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) 
        )   
}
Lepisma
fuente
1
Esto es muy útil, gracias. Para su información, he encontrado plot.backgroundque se debe pasar el argumento a theme. Los otros argumentos son opcionales.
Racing Tadpole
1

Aquí hay un tema personalizado para hacer que el fondo de ggplot2 sea blanco y un montón de otros cambios que son buenos para publicaciones y carteles. Solo agrega + mytheme. Si desea agregar o cambiar opciones por + tema después de + mytheme, simplemente reemplazará esas opciones de + mytheme.

library(ggplot2)
library(cowplot)
theme_set(theme_cowplot())

mytheme = list(
    theme_classic()+
        theme(panel.background = element_blank(),strip.background = element_rect(colour=NA, fill=NA),panel.border = element_rect(fill = NA, color = "black"),
              legend.title = element_blank(),legend.position="bottom", strip.text = element_text(face="bold", size=9),
              axis.text=element_text(face="bold"),axis.title = element_text(face="bold"),plot.title = element_text(face = "bold", hjust = 0.5,size=13))
)

ggplot(data=data.frame(a=c(1,2,3), b=c(2,3,4)), aes(x=a, y=b)) + mytheme + geom_line()

tema ggplot personalizado

Isaac Zhao
fuente