Skip to content
thomaskern edited this page Jul 15, 2011 · 22 revisions

Proposed themes and theme enhancements.

enhancements

borderless frames

theme_border_numerictype <- function(type, colour = "black", size = 1, linetype = 1) {

use with e.g.: ggplot(...) + opts( panel.border=theme_border(type=9) ) + ...

structure( function(x = 0, y = 0, width = 1, height = 1, ...) { # numerical types from: library(gridExtra); example(borderGrob) # 1=none, 2=bottom, 3=right, 4=top, 5=left, 6=B+R, 7=T+R, 8=T+L, 9=B+L, 10=T+B, 11=L+R, 12=T+B+R, 13=T+L+R, 14=T+B+L, 15=B+L+R, 16=T+B+L+R xlist <- c() ylist <- c() idlist <- c() if (type==2 || type==6 || type==9 || type==10 || type==12 || type==14 || type==15 || type==16) { # bottom xlist <- append(xlist, c(x, x+width)) ylist <- append(ylist, c(y, y)) idlist <- append(idlist, c(1,1)) } if (type==4 || type==7 || type==8 || type==10 || type==12 || type==13 || type==14 || type==16) { # top xlist <- append(xlist, c(x, x+width)) ylist <- append(ylist, c(y+height, y+height)) idlist <- append(idlist, c(2,2)) } if (type==5 || type==8 || type==9 || type==11 || type==13 || type==14 || type==15 || type==16) { # left xlist <- append(xlist, c(x, x)) ylist <- append(ylist, c(y, y+height)) idlist <- append(idlist, c(3,3)) } if (type==3 || type==6 || type==7 || type==11 || type==12 || type==13 || type==15 || type==16) { # right xlist <- append(xlist, c(x+width, x+width)) ylist <- append(ylist, c(y, y+height)) idlist <- append(idlist, c(4,4)) } if (type==1) { # blank; can't pass absence of coordinates, so pass a single point and use an invisible line xlist <- c(x,x) ylist <- c(y,y) idlist <- c(5,5) linetype <- "blank" } polylineGrob( x=xlist, y=ylist, id=idlist, ..., default.units = "npc", gp=gpar(lwd=size, col=colour, lty=linetype), ) }, class = "theme", type = "box", call = match.call() )

}

theme_border <- function(type = c("left", "right", "bottom", "top", "none"), ratio=1, expanding=c(0,0), colour = "black", size = 1, linetype = 1) {

use with e.g.: ggplot(...) + opts(panel.border=theme_border(type=c("bottom","left")) ) + ...

type <- match.arg(type, several.ok=TRUE) structure( function(x = 0, y = 0, width = 1, height = 1, ...) { xlist <- c() ylist <- c() idlist <- c() if ("bottom" %in% type) { # bottom xlist <- append(xlist, c(x, x+expanding[1]+( width - expanding[1]*2)*ratio)) ylist <- append(ylist, c(y, y)) idlist <- append(idlist, c(1,1)) } if ("top" %in% type) { # top xlist <- append(xlist, c(x, x+width)) ylist <- append(ylist, c(y+height, y+height)) idlist <- append(idlist, c(2,2)) } if ("left" %in% type) { # left xlist <- append(xlist, c(x, x)) ylist <- append(ylist, c(y, y+height - expanding[2])) idlist <- append(idlist, c(3,3)) } if ("right" %in% type) { # right xlist <- append(xlist, c(x+0, x+0)) ylist <- append(ylist, c(y, y+height)) idlist <- append(idlist, c(4,4)) } if (length(type)==0 || "none" %in% type) { # blank; can't pass absence of coordinates, so pass a single point and use an invisible line xlist <- c(x,x) ylist <- c(y,y) idlist <- c(5,5) linetype <- "blank" } polylineGrob( x=xlist, y=ylist, id=idlist, ..., default.units = "npc", gp=gpar(lwd=size, col=colour, lty=linetype), ) }, class = "theme", type = "box", call = match.call() ) }

theme_minimal

minimalistic theme to maximize data/ink ratio, so as to focus more strongly on the data glyphs. It also serves to facilitate post-processing in graphic design software (Illustrator, Inkscape)

     theme_minimal <- function (base_size = 12, base_family = "") 
     {
         structure(list(axis.line = theme_blank(), axis.text.x = theme_text(family = base_family, 
             size = base_size * 0.8, lineheight = 0.9, vjust = 1), 
             axis.text.y = theme_text(family = base_family, size = base_size * 
                 0.8, lineheight = 0.9, hjust = 1), axis.ticks = theme_segment(colour = "black", 
                 size = 0.2), axis.title.x = theme_text(family = base_family, 
                 size = base_size, vjust = 1), axis.title.y = theme_text(family = base_family, 
                 size = base_size, angle = 90, vjust = 0.5), axis.ticks.length = unit(0.3, 
                 "lines"), axis.ticks.margin = unit(0.5, "lines"), 
             legend.background = theme_rect(colour = NA), legend.key = theme_rect(colour = NA), 
             legend.key.size = unit(1.2, "lines"), legend.key.height = NA, 
             legend.key.width = NA, legend.text = theme_text(family = base_family, 
                 size = base_size * 0.8), legend.text.align = NA, 
             legend.title = theme_text(family = base_family, size = base_size * 
                 0.8, face = "bold", hjust = 0), legend.title.align = NA, 
             legend.position = "right", legend.direction = "vertical", 
             legend.box = NA, panel.background = theme_rect(fill = "white", 
                 colour = NA), panel.border = theme_rect(fill = NA, 
                 colour = "grey90"), panel.grid.major = theme_line(colour = "grey90", 
                 size = 0.2), panel.grid.minor = theme_line(colour = "grey98", 
                 size = 0.5), panel.margin = unit(0.25, "lines"), 
             strip.background = theme_rect(fill = NA, colour = NA), 
             strip.text.x = theme_text(family = base_family, size = base_size * 
                 0.8), strip.text.y = theme_text(family = base_family, 
                 size = base_size * 0.8, angle = -90), plot.background = theme_rect(colour = NA), 
             plot.title = theme_text(family = base_family, size = base_size * 
                 1.2), plot.margin = unit(c(1, 1, 0.5, 0.5), "lines")), 
             class = "options")
     }

Comment: I like the axis ticks and text and panel border rectangle in more similar colour: so either

theme_minimal_cb <- modifyList (theme_minimal (), 
                                  list (panel.border = theme_rect(fill = NA, colour = "grey50")))
theme_minimal_cb_L <- modifyList (theme_minimal (), 
                                  list (axis.line = theme_segment (colour = "black")))

or (a very light version)

theme_minimal_light <- modifyList (theme_minimal (), 
                                     list (axis.ticks = theme_segment (colour = "grey50"), 
                                           axis.text.x = theme_text (colour = "grey33"), 
                                           axis.text.y = theme_text (colour = "grey33")))

theme_fullframe

Maximize the plotting area so as to extend over the full viewport. Axis labels and titles are masked; this theme is therefore limited to special graphs such as images where full control over the image size is required (e.g. for alignment with other graphical elements).

theme_fullframe <- function (base_size = 12){
  structure(list(
    axis.line = theme_blank(), 
    axis.text.x = theme_blank(), 
    axis.text.y = theme_blank(),
    axis.ticks = theme_blank(), 
    axis.title.x = theme_blank(), 
    axis.title.y = theme_blank(), 
    axis.ticks.length = unit(0, "lines"), 
    axis.ticks.margin = unit(0, "lines"), 
    legend.position = "none", 
    panel.background = theme_blank(), 
    panel.border = theme_blank(), 
    panel.grid.major = theme_blank(), 
    panel.grid.minor = theme_blank(), 
    panel.margin = unit(0, "lines"), 
    plot.background = theme_blank(), 
    plot.margin = unit(c(-1.5, -1.5, -1.5, -1.5), "lines")
  ), class = "options")
}

theme_black

A black theme for black background presentations. Note that using this typically involves changing the colour/fill aesthetics for viewing.

theme_black <- function (base_size = 12){
  structure(list(
    axis.line = theme_blank(), 
    axis.text.x = theme_text(size = base_size * 0.8, colour = 'white', lineheight = 0.9, vjust = 1), 
    axis.text.y = theme_text(size = base_size * 0.8, colour = 'white', lineheight = 0.9, hjust = 1), 
    axis.ticks = theme_segment(colour = "white", size = 0.2), 
    axis.title.x = theme_text(size = base_size, colour = 'white', vjust = 1), 
    axis.title.y = theme_text(size = base_size, colour = 'white', angle = 90, vjust = 0.5), 
    axis.ticks.length = unit(0.3, "lines"), 
    axis.ticks.margin = unit(0.5, "lines"), 
    legend.background = theme_rect(colour = NA), 
    legend.key = theme_rect(colour = "white", fill = 'black'), 
    legend.key.size = unit(1.2, "lines"), 
    legend.key.height = NA, 
    legend.key.width = NA,     
    legend.text = theme_text(size = base_size * 0.8, colour = 'white'), 
    legend.title = theme_text(size = base_size * 0.8, face = "bold", hjust = 0, colour = 'white'), 
    legend.position = "right", 
    legend.text.align = NA, 
    legend.title.align = NA, 
    legend.direction = "vertical", 
    legend.box = NA,    
    panel.background = theme_rect(fill = "black", colour = NA), 
    panel.border = theme_rect(fill = NA, colour = "white"), 
    panel.grid.major = theme_line(colour = "grey20", size = 0.2), 
    panel.grid.minor = theme_line(colour = "grey5", size = 0.5), 
    panel.margin = unit(0.25, "lines"), 
    strip.background = theme_rect(fill = "grey30", colour = "grey10"), 
    strip.text.x = theme_text(size = base_size * 0.8, colour = 'white'), 
    strip.text.y = theme_text(size = base_size * 0.8, colour = 'white', angle = -90), 
    plot.background = theme_rect(colour = 'black', fill = 'black'), 
    plot.title = theme_text(size = base_size * 1.2), 
    plot.margin = unit(c(1, 1, 0.5, 0.5), "lines")
  ), class = "options")
}

Note: The ggplot2 wiki is no longer maintained, please use the ggplot2 website instead!

Clone this wiki locally