Jak zmienić kolor tła wykresu utworzonego za pomocą ggplot2

101

Domyślnie ggplot2 tworzy wykresy z szarym tłem. Jak zmienić kolor tła działki?

Na przykład działka utworzona za pomocą następującego kodu:

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
źródło

Odpowiedzi:

127

Aby zmienić kolor tła panelu, użyj następującego kodu:

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

Aby zmienić kolor wykresu (ale nie kolor panelu), możesz:

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

Zobacz tutaj, aby uzyskać więcej szczegółów na temat motywu Arkusz szybkiego odniesienia dla legend, osi i motywów .

Jack Edmonds
źródło
40
Jest też theme_bw, dający białe tło i szare linie siatki. Używam go cały czas, ponieważ w druku wygląda znacznie lepiej niż domyślne szare tło:myplot + theme_bw()
ROLO
@ROLO: Świetnie! Czy istnieje sposób domyślnego zastosowania tego do wszystkich działek?
krlmlr
11
Umieść to na początku swojego skryptu dla domyślnych czarno-białych wykresów gg: ggplot <- function(...) { ggplot2::ggplot(...) + theme_bw() }
ROLO,
1
@ROLO zasługuje na własną odpowiedź, zwłaszcza, że ​​odpowiedź Jacka nie zmienia koloru linii siatki.
naught101
7
Zauważ, że optsi theme_rectsą przestarzałe w nowszych wersjach ggplot2. (0,9,3). Tak więc nowsza wersja drugiego polecenia to:myplot + theme(plot.background = element_rect(fill='green', colour='red'))
Ram Narasimhan
50

Aby uniknąć wycofania optsi theme_rectużywania:

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

Aby zdefiniować własny motyw niestandardowy, oparty na theme_gray, ale z niektórymi zmianami i kilkoma dodatkami, w tym kontrolą koloru / rozmiaru linii siatki (więcej opcji dostępnych na 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")
    )   
}

Aby ustawić niestandardowy motyw jako domyślny, gdy w przyszłości będzie wywoływany ggplot, bez maskowania:

theme_set(theme_jack())

Jeśli chcesz zmienić element aktualnie ustawionego motywu:

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

Aby zapisać bieżący domyślny motyw jako obiekt:

theme_pink <- theme_get()

Zauważ, że theme_pinkjest to lista, podczas gdy theme_jackbyła funkcją. Tak więc, aby zwrócić motyw do pliku theme_jack, użyj theme_set(theme_jack())natomiast, aby powrócić do użycia theme_pink theme_set(theme_pink).

Można zastąpić theme_grayprzez theme_bww definicji theme_jack, jeśli wolisz. Aby Twój motyw niestandardowy był podobny, theme_bwale z wyłączonymi wszystkimi liniami siatki (x, y, major i minor):

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

Wreszcie bardziej radykalny temat przydatny podczas kreślenia kartogramów lub innych map w ggplot, oparty na dyskusji tutaj, ale zaktualizowany, aby uniknąć przestarzałych. Celem jest usunięcie szarego tła i wszelkich innych elementów, które mogą odwracać uwagę od mapy.

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) 
        )   
}
Rybik cukrowy
źródło
1
To jest bardzo pomocne, dzięki. FYI, stwierdziłem, że argument plot.backgroundmusi zostać przekazany do theme. Pozostałe argumenty są opcjonalne.
Racing Tadpole
1

Oto niestandardowy motyw, dzięki któremu tło ggplot2 będzie białe i kilka innych zmian, które są dobre dla publikacji i plakatów. Po prostu dodaj + mój motyw. Jeśli chcesz dodać lub zmienić opcje za pomocą + motywu po + mytheme, po prostu zastąpi te opcje z + 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()

niestandardowy motyw ggplot

Isaac Zhao
źródło