Como mudo a cor de fundo de um gráfico feito com ggplot2

95

Por padrão, ggplot2 produz plotagens com um fundo cinza. Como eu mudo a cor de fundo da trama?

Por exemplo, um gráfico produzido pelo seguinte 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
fonte

Respostas:

120

Para alterar a cor de fundo do painel, use o seguinte código:

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

Para alterar a cor do gráfico (mas não a cor do painel), você pode fazer:

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

Veja aqui mais detalhes do tema. Folha de referência rápida para legendas, eixos e temas .

Jack Edmonds
fonte
39
Também existe o theme_bw, dando a você um fundo branco e linhas de grade cinza. Eu o uso o tempo todo, pois na impressão parece muito melhor do que o fundo cinza padrão:myplot + theme_bw()
ROLO
@ROLO: Legal! Existe uma maneira de aplicar isso a todos os gráficos por padrão?
krlmlr
11
Coloque isso no início do seu script para ggplots P&B padrão: ggplot <- function(...) { ggplot2::ggplot(...) + theme_bw() }
ROLO
1
@ROLO que merece sua própria resposta, especialmente porque a resposta de Jack não muda a cor das linhas da grade.
naught101 de
7
Observe que optse theme_rectestão obsoletos nas versões mais recentes do ggplot2. (0.9.3). Portanto, a versão mais recente do segundo comando se tornaria:myplot + theme(plot.background = element_rect(fill='green', colour='red'))
Ram Narasimhan
50

Para evitar obsoleta optse theme_rectuso:

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

Para definir seu próprio tema personalizado, com base em theme_gray, mas com algumas de suas alterações e alguns extras adicionados, incluindo controle de cor / tamanho da linha de grade (mais opções disponíveis para jogar em 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 tornar seu tema personalizado o padrão quando o ggplot for chamado no futuro, sem mascarar:

theme_set(theme_jack())

Se você deseja alterar um elemento do tema definido atualmente:

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

Para armazenar o tema padrão atual como um objeto:

theme_pink <- theme_get()

Observe que theme_pinké uma lista enquanto theme_jackera uma função. Portanto, para retornar o tema ao uso de theme_jack, theme_set(theme_jack())ao passo que retornar ao uso de theme_pink theme_set(theme_pink).

Você pode substituir theme_graypor theme_bwna definição de theme_jackse preferir. Para que seu tema personalizado se pareça, theme_bwmas com todas as linhas de grade (x, y, maior e menor) desligadas:

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, um tema mais radical útil ao plotar choropleths ou outros mapas no ggplot, com base na discussão aqui, mas atualizado para evitar a depreciação. O objetivo aqui é remover o fundo cinza e quaisquer outros recursos que possam desviar a atenção do 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) 
        )   
}
Silverfish
fonte
1
Isso é muito útil, obrigado. FYI, eu descobri que o argumento plot.backgrounddeve ser passado para theme. Os outros argumentos são opcionais.
Racing Tadpole
1

Aqui está um tema personalizado para tornar o fundo do ggplot2 branco e um monte de outras mudanças que são boas para publicações e pôsteres. Basta adicionar + mytheme. Se você quiser adicionar ou alterar opções por + tema após + meutema, ele apenas substituirá essas opções de + meutema.

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
fonte