Site icon R-bloggers

GMT standard color palettes

[This article was first published on me nugget, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
GMT (Generic Mapping Tools) (http://gmt.soest.hawaii.edu/) is a great mapping tool. I’m hoping to use it more in the future, but for the meantime I wanted to recreate some of the it’s standard color palettes in R. Unfortunately, I couldn’t find documentation of the precise rgb color levels used, so I ended up “stealing” them from the .png images on this website: http://www.geos.ed.ac.uk/it/howto/GMT/CPT/palettes.html

Here’s the result:
 




Here’s how I extracted the color levels from the .png images:

#make palettes
library(png)
 
pal.names <- c(
"cool","copper","gebco","globe",
"gray","haxby","hot","jet",
"no_green","ocean","polar","rainbow",
"red2green","relief","sealand","seis",
"split","topo","wysiwyg"
)
 
png.urls <- paste0("http://www.geos.ed.ac.uk/it/howto/GMT/CPT/cpt-", pal.names, ".png")
 
gmt.pals <- vector(mode="list", length(pal.names)) 
names(gmt.pals) <- pal.names
for(i in seq(gmt.pals)){
 myurl <- png.urls[i]
 tmp <- tempfile()
 download.file(myurl,tmp,mode="wb")
 pic <- readPNG(tmp)
 file.remove(tmp) # cleanup
 
 Colors <- NA * seq(20)
 row <- round(dim(pic)[1]/2)
 breaks <- seq(1, dim(pic)[2],,21)
 cols <- round(breaks[-1] - ((breaks[2]-breaks[1])/2))
 gmt.pals[[i]] <- rev(rgb(pic[row,cols,1], pic[row,cols,2], pic[row,cols,3])) # reverses colors to put low color values first in the vector
 
}
 
#plot of palettes
png("gmt_palettes.png", width=6, height=10, units="in", res=400)
op <- par(mar=c(0.25,0.25,1.25,0.25), mfrow=c(length(gmt.pals), 1), ps=10)
for(i in seq(gmt.pals)){
 image(matrix(seq(gmt.pals[[i]]), length(gmt.pals[[i]])), 1, col=gmt.pals[[i]], axes=FALSE)
 box()
 mtext(names(gmt.pals)[i], side=3, line=0.1)
}
par(op)
dev.off()



Finally, I created a function (‘gmtColors‘) that allows me to call these color levels by GMT palette name:

#function 'gmtColors' to call color levels.
#palette name `pal.name` is one of the following:
#"cool", "copper", "gebco", "globe", "gray",
#"haxby", "hot", "jet", "no_green", "ocean",
#"polar", "rainbow", "red2green", "relief", "sealand",
#"seis", "split", "topo", "wysiwyg"
gmtColors <- function(pal.name="relief"){
 tmp <- structure(list(cool = c("#00FFFF", "#0DF2FF", "#19E6FF", "#26D9FF", 
"#33CCFF", "#3FBFFF", "#4CB3FF", "#59A6FF", "#6699FF", "#738CFF", 
"#7F7FFF", "#8C73FF", "#9966FF", "#A659FF", "#B24DFF", "#BF3FFF", 
"#CC33FF", "#D926FF", "#E619FF", "#F20DFF"), copper = c("#000000", 
"#100906", "#1F130D", "#301E13", "#40281A", "#50321F", "#603C26", 
"#70462D", "#805033", "#905A3A", "#A06440", "#B06E46", "#C0784D", 
"#D08253", "#E08C5A", "#F09660", "#FFA066", "#FFAA6D", "#FFB473", 
"#FFBE7A"), gebco = c("#00F0FF", "#00F0FF", "#00F0FF", "#23FFFF", 
"#23FFFF", "#23FFFF", "#5AFFFF", "#5AFFFF", "#5AFFFF", "#8CFFE6", 
"#8CFFE6", "#8CFFE6", "#A5FFD7", "#A5FFD7", "#A5FFD7", "#C3FFD7", 
"#C3FFD7", "#C3FFD7", "#D2FFD7", "#E6FFF0"), globe = c("#9900FF", 
"#9900FF", "#7722FF", "#5544FF", "#3366FF", "#1188FF", "#1BA4FF", 
"#51BAFF", "#86D0FF", "#BCE6FF", "#336600", "#F3CA89", "#D9A627", 
"#A49019", "#9F7B0D", "#996600", "#B27676", "#C2B0B0", "#E5E5E5", 
"#FFFFFF"), gray = c("#000000", "#0D0D0D", "#191919", "#262626", 
"#333333", "#3F3F3F", "#4C4C4C", "#595959", "#666666", "#737373", 
"#7F7F7F", "#8C8C8C", "#999999", "#A6A6A6", "#B2B2B2", "#BFBFBF", 
"#CCCCCC", "#D9D9D9", "#E6E6E6", "#F2F2F2"), haxby = c("#090079", 
"#280096", "#0009C8", "#0019D4", "#1A66F0", "#19AFFF", "#32BEFF", 
"#61E1F0", "#6AECE1", "#8AECAE", "#CDFFA2", "#DFF68D", "#F8D768", 
"#FFBD57", "#F4754B", "#FF5A5A", "#FF7C7C", "#F6B3AE", "#FFC4C4", 
"#FFECEC"), hot = c("#000000", "#220000", "#440000", "#660000", 
"#880000", "#AA0000", "#CC0000", "#EE0000", "#FF1100", "#FF3300", 
"#FF5500", "#FF7700", "#FF9900", "#FFBB00", "#FFDD00", "#FFFF00", 
"#FFFF33", "#FFFF66", "#FFFF99", "#FFFFCC"), jet = c("#00007F", 
"#0000B2", "#0000E5", "#0019FF", "#004DFF", "#007FFF", "#00B2FF", 
"#00E5FF", "#FFFFF2", "#FFFFD9", "#FFFFBF", "#FFFFA5", "#FFFF8C", 
"#FFE500", "#FFB300", "#FF7F00", "#FF4C00", "#FF1900", "#E50000", 
"#B20000"), no_green = c("#1F60FF", "#1F60FF", "#1F9FFF", "#1FBFFF", 
"#00CFFF", "#2AFFFF", "#2AFFFF", "#55FFFF", "#7FFFFF", "#AAFFFF", 
"#FFFF54", "#FFFF54", "#FFF000", "#FFBF00", "#FFA800", "#FF8A00", 
"#FF8A00", "#FF7000", "#FF4D00", "#FF0000"), ocean = c("#000000", 
"#000209", "#000413", "#00061E", "#000728", "#000932", "#002650", 
"#00426E", "#005E8C", "#007AAA", "#0096C8", "#22A9C2", "#45BCBB", 
"#67CFB5", "#8AE2AE", "#ACF6A8", "#BCF8B9", "#CBF9CA", "#DBFBDC", 
"#EBFDED"), polar = c("#0000FF", "#1919FF", "#3333FF", "#4C4CFF", 
"#6666FF", "#7F7FFF", "#9999FF", "#B2B2FF", "#CCCCFF", "#E6E6FF", 
"#FFFFFF", "#FFE5E5", "#FFCCCC", "#FFB2B2", "#FF9999", "#FF7F7F", 
"#FF6666", "#FF4C4C", "#FF3333", "#FF1A1A"), rainbow = c("#FF00FF", 
"#BF00FF", "#7F00FF", "#3F00FF", "#0000FF", "#003FFF", "#007FFF", 
"#00BFFF", "#00FFFF", "#00FFBF", "#00FF7F", "#00FF3F", "#00FF00", 
"#3FFF00", "#7FFF00", "#BFFF00", "#FFFF00", "#FFBF00", "#FF7F00", 
"#FF3F00"), red2green = c("#FF0000", "#FF1919", "#FF3333", "#FF4C4C", 
"#FF6666", "#FF7F7F", "#FF9999", "#FFB2B2", "#FFCCCC", "#FFE6E6", 
"#FFFFFF", "#E5FFE5", "#CCFFCC", "#B2FFB2", "#99FF99", "#7FFF7F", 
"#66FF66", "#4CFF4C", "#33FF33", "#1AFF1A"), relief = c("#000000", 
"#000413", "#000728", "#002650", "#005E8C", "#0096C8", "#45BCBB", 
"#8AE2AE", "#BCF8B9", "#DBFBDC", "#467832", "#887438", "#B19D48", 
"#DBC758", "#FAE769", "#FAEB7E", "#FCED93", "#FCF1A7", "#FCF6C1", 
"#FDFAE0"), sealand = c("#8C66FF", "#6A66FF", "#6684FF", "#66A7FF", 
"#66CAFF", "#66ECFF", "#66FFF0", "#66FFCE", "#66FFAB", "#66FF88", 
"#66FF66", "#88FF66", "#ABFF66", "#CEFF66", "#FFEEA6", "#FFD3A6", 
"#FFB8A6", "#FFAAB0", "#FFB5CB", "#FFC0E1"), seis = c("#AA0000", 
"#D00000", "#F70000", "#FF1D00", "#FF4400", "#FF6A00", "#FF9000", 
"#FFB700", "#FFDD00", "#FFFF00", "#FFFF00", "#FFFF00", "#BDFF0C", 
"#73FF1A", "#3FFA36", "#16F45A", "#00D08B", "#0087CD", "#0048FA", 
"#0024E3"), split = c("#7F7FFF", "#6666E6", "#4D4DCC", "#3333B3", 
"#1A1A99", "#00007F", "#000066", "#00004D", "#000033", "#00001A", 
"#000000", "#1A0000", "#330000", "#4D0000", "#660000", "#7F0000", 
"#991A1A", "#B33333", "#CC4D4D", "#E66666"), topo = c("#C977D9", 
"#A18AE6", "#8AA2E6", "#8BD1E7", "#8AF3CF", "#85F38E", "#BDF385", 
"#EDE485", "#F0B086", "#DE9F8B", "#74A3B3", "#99CC70", "#DCD68E", 
"#EDDFAD", "#F7E8CA", "#FFF9F3", "#FFF9F6", "#FFFBF9", "#FFFCFA", 
"#FFFEFD"), wysiwyg = c("#3F003F", "#3F003F", "#3F00BF", "#003FFF", 
"#00A0FF", "#3FBFFF", "#3FBFFF", "#40E0FF", "#3FFFBF", "#3FFF3F", 
"#7FFF3F", "#BFFF3F", "#BFFF3F", "#FFE040", "#FFE040", "#FF6040", 
"#FF1F40", "#FF60C0", "#FFA0FF", "#FFA0FF")), .Names = c("cool", 
"copper", "gebco", "globe", "gray", "haxby", "hot", "jet", "no_green", 
"ocean", "polar", "rainbow", "red2green", "relief", "sealand", 
"seis", "split", "topo", "wysiwyg"))
 
 tmp[[match(pal.name, names(tmp))]]
}



To leave a comment for the author, please follow the link and comment on their blog: me nugget.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.