如何更改使用ggplot2制作的绘图的背景颜色

Jac*_*nds 87 r ggplot2

默认情况下,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
Run Code Online (Sandbox Code Playgroud)

Jac*_*nds 110

要更改面板的背景颜色,请使用以下代码:

myplot + theme(panel.background = element_rect(fill = 'green', colour = 'red'))
Run Code Online (Sandbox Code Playgroud)

要更改绘图的颜色(但不更改面板的颜色),您可以执行以下操作:

myplot + theme(plot.background = element_rect(fill = 'green', colour = 'red'))
Run Code Online (Sandbox Code Playgroud)

有关更多主题详情,请参阅此处有关图例,轴和主题的快速参考表.

  • 还有`theme_bw`,给你一个白色背景和灰色网格线.我一直都在使用它,因为在打印中它看起来比默认的灰色背景要好得多:`myplot + theme_bw()` (39认同)
  • 把它放在脚本的开头,用于默认的B&W ggplots:`ggplot < - function(...){ggplot2 :: ggplot(...)+ theme_bw()}` (11认同)
  • 请注意,在较新版本的ggplot2中不推荐使用`opts`和`theme_rect`.(0.9.3).所以第二个命令的新版本将成为:`myplot + theme(plot.background = element_rect(fill ='green',color ='red'))` (7认同)
  • @ROLO值得它自己的答案,特别是因为杰克的答案不会改变网格线的颜色。 (2认同)

Sil*_*ish 50

为避免弃用optstheme_rect使用:

myplot + theme(panel.background = element_rect(fill='green', colour='red'))
Run Code Online (Sandbox Code Playgroud)

要定义自己的自定义主题,请基于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")
    )   
}
Run Code Online (Sandbox Code Playgroud)

要在将来调用ggplot时使自定义主题成为默认主题,而不进行屏蔽:

theme_set(theme_jack())
Run Code Online (Sandbox Code Playgroud)

如果要更改当前设置主题的元素:

theme_update(plot.background = element_rect(fill="pink"), axis.title.x = element_text(colour = "red"))
Run Code Online (Sandbox Code Playgroud)

要将当前默认主题存储为对象:

theme_pink <- theme_get()
Run Code Online (Sandbox Code Playgroud)

请注意,这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()
    )   
}
Run Code Online (Sandbox Code Playgroud)

最后一个更激进的主题在ggplot中绘制choropleths或其他地图时很有用,基于此处的讨论但更新以避免弃用.这里的目的是删除灰色背景,以及可能分散地图的任何其他功能.

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) 
        )   
}
Run Code Online (Sandbox Code Playgroud)