Как изменить цвет фона графика, созданного с помощью ggplot2


101

По умолчанию ggplot2 создает графики с серым фоном. Как изменить цвет фона сюжета?

Например, сюжет, созданный следующим кодом:

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

Ответы:


127

Чтобы изменить цвет фона панели, используйте следующий код:

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

Чтобы изменить цвет графика (но не цвет панели), вы можете:

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

См. Здесь для получения дополнительных сведений о теме. Краткий справочник по легендам, осям и темам .


40
Также есть значок theme_bw, дающий вам белый фон и серые линии сетки. Я использую его постоянно, так как в печати он выглядит намного лучше, чем серый фон по умолчанию:myplot + theme_bw()
РОЛО

@ROLO: Хорошо! Есть ли способ применить это ко всем графикам по умолчанию?
krlmlr 02

11
Поместите это в начало вашего скрипта для черно-белых ggplot <- function(...) { ggplot2::ggplot(...) + theme_bw() }
графиков ggplots

1
@ROLO, который заслуживает своего собственного ответа, особенно потому, что ответ Джека не меняет цвет линий сетки.
naught101

7
Обратите внимание, что optsи theme_rectустарели в новых версиях ggplot2. (0.9.3). Таким образом, новая версия второй команды будет выглядеть так:myplot + theme(plot.background = element_rect(fill='green', colour='red'))
Рам Нарасимхан

50

Чтобы избежать устаревания optsи theme_rectиспользовать:

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

Чтобы определить свою собственную тему на основе theme_gray, но с некоторыми вашими изменениями и некоторыми дополнительными функциями, включая управление цветом / размером линии сетки (дополнительные параметры доступны на 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")
    )   
}

Чтобы сделать вашу настраиваемую тему по умолчанию при вызове ggplot в будущем без маскировки:

theme_set(theme_jack())

Если вы хотите изменить элемент текущей установленной темы:

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

Чтобы сохранить текущую тему по умолчанию как объект:

theme_pink <- theme_get()

Обратите внимание, что theme_pinkэто список, тогда как theme_jackбыл функцией. Итак, чтобы вернуть тему к использованию theme_jack, theme_set(theme_jack())а для возврата к использованию theme_pink theme_set(theme_pink).

Вы можете заменить theme_grayего theme_bwна в определении, theme_jackесли хотите. Чтобы ваша настраиваемая тема theme_bwвыглядела похожей, но все линии сетки (x, y, основная и второстепенная) были отключены:

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

Наконец, более радикальная тема, полезная при построении хороплетов или других карт в ggplot, основанная на обсуждении здесь, но обновленная, чтобы избежать устаревания. Здесь цель состоит в том, чтобы удалить серый фон и любые другие элементы, которые могут отвлекать от карты.

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

1
Это очень полезно, спасибо. К вашему сведению, я обнаружил, что аргумент plot.backgroundнеобходимо передать theme. Остальные аргументы необязательны.
Racing Tadpole

1

Вот настраиваемая тема, чтобы сделать фон ggplot2 белым, и множество других изменений, которые подходят для публикаций и плакатов. Просто добавь + mytheme. Если вы хотите добавить или изменить параметры с помощью + темы после + mytheme, он просто заменит эти параметры из + 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()

пользовательская тема ggplot

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.