R语言:填色等值线图及其色标(color bar)设置

更多填色等值线图的绘制请参考R语言:如何在一张图上画多个填色等值线图


在气象数据分析中,经常用填色等值线图来表现气象要素的空间分布特点,例如下图中给出了1997年12月的海表温度异常(SSTA)的空间分布情况:


在R语言中,这种图可以使用filled.contour函数绘制:

filled.contour(  x = seq(0, 1, length.out = nrow(z)),

          y = seq(0, 1, length.out =ncol(z)),

           z,

           xlim = range(x, finite = TRUE),

          ylim = range(y, finite = TRUE),

           zlim = range(z, finite = TRUE),

          levels = pretty(zlim, nlevels), nlevels = 20,

          color.palette = cm.colors,

          col = color.palette(length(levels) - 1),

           plot.title, plot.axes, key.title,key.axes,

          asp = NA, xaxs = "i", yaxs = "i", las = 1,

          axes = TRUE, frame.plot = axes,  ...)

其主要参数如下:

z即为将要呈现的数据,其须是数值型(numeric)的矩阵格式(matrix);

x和y分别是X轴和Y轴的格点刻度,注意x和y的长度必须与z的维度相匹配,且x和y序列必须为升序排列;

xlim,ylim和zlim分别是绘图中最终显示出来的x,y和z的范围;

levels是色标的刻度;

nlevels即是色标刻度的数目,也就等于levels的长度(levels和nlevels如果只设置了一个,另一个将会自动生成);

color.palette是调色板函数,默认值为浅蓝洋红色系;

col即是色标上显示的不同颜色,若col未人工设置,将根据levels,nlevels以及color.palette自动生成;

plot.title和plot.axes用于调整主图的标题和坐标轴刻度;

key.title和key.axes用于调整色标的标题和刻度;

asp是指作图的高宽比(y/x);

xaxs和yaxs分别是X轴和Y轴的刻度线类型;

las指坐标轴刻度标签的文字书写方向,默认值为1,表示刻度标签从左到右横向书写。

 

filled.contour函数最少只需数据z即可绘制,我们以1997年12月的SSTA数据为例(数据的读取可参考NC数据的读写),代码和结果如下图:

z <- ssta_1997_12
filled.contour(z = z)



更加细致的绘图需要设定更多的参数:

x <- seq(from = 98.5, to = 288.5, by =1)
y <- seq(from = -20.5, to = 20.5, by =1)
z <- sst_a[, 42:1, 12, 17]
levels <- seq(-6, 6, 1)
filled.contour(x = x, y = y, z = z, levels= levels,
               las = 1,
               plot.title = title(main ="Dec 1997", cex.main = 2),
               plot.axes = list(axis(1,seq(100, 160, by = 20), c('100E', NA, '140E', NA)),
                                axis(1, 180,180),
                                axis(1,seq(200, 280, by = 20), c(NA, '140W', NA, '100W', NA)),
                                axis(2,seq(-20, 20, by = 10), c('20S', '10S', 'Eq', '10N', '20N'))),
               key.title = title(main ='degC'))

然而浅蓝洋红色系给出的对比效果并不明显,如需提高对比度则应调整调色板函数。

R语言自带了5种连续型色彩渐变调色板函数:

rainbow

heat.colors

terrain.colors

topo.colors

cm.colors

其中cm.colors即是filled.contour中默认使用的浅蓝洋红色系调色板。

接下来我们看一下各个色系的颜色:

## plot_col函数用来显示不同调色板下的色彩变化
plot_col <- function (nlev, col) {
 plot(x = c(1, (nlev + 1)), y = c(1, 2),
      xaxs = 'i', yaxs = 'i', xaxt = 'n', yaxt = 'n', type = 'n', ann = F)
 rect(xleft = 1:nlev,
      ybottom = rep(0, (nlev + 1)),
      xright = 2:(nlev + 1),
      ytop = rep(2, (nlev + 1)),
      col = col, border = 1)
 par(new = T)
 plot(x = c(1, (nlev + 1)), y = c(1, 2),
      xaxs = 'i', yaxs = 'i', xaxt = 'n', yaxt = 'n', type = 'n', ann = F)
}
nlev <- 12
col <- cm.colors(nlev)
plot_col(nlev, col)


col <- heat.colors(nlev)
plot_col(nlev, col)


col <- terrain.colors(nlev)
plot_col(nlev, col)


col <- topo.colors(nlev)
plot_col(nlev, col)


col <- rainbow(nlev)
plot_col(nlev, col)


如果需要其他色系的调色板,比如文章开头给出的红蓝色系,则可以使用colorRampPalette函数定制。

colorRampPalette (  colors, bias = 1, space= c("rgb", "Lab"),

                interpolate =c("linear", "spline"), alpha = FALSE)

其最主要的参数colors是要生成的调色板色系的基础颜色(需是颜色名称或颜色十六进制编码),以文章开头的红蓝色系为例:

colors <- c('blue', "white",'red')
RB <- colorRampPalette(colors = colors)
col <- RB(nlev)
plot_col(nlev, col)


其余参数则对颜色渐变的方式做出调整,

bias取值需大于0,当其大于1时,生成的颜色中趋向于colors参数中后部的颜色更多,小于1时,生成的颜色中趋向于colors参数中前部的颜色更多;

space和interpolate表示不同的颜色生成方式和插值方式;

alpha调节透明度。

将filled.contour中的color.palette参数改为刚才我们利用colorRampPalette函数生成的红白色系调色板R函数即可得到文章开头的填色等值线图。

filled.contour(x = x, y = y, z = z, levels= levels,
               color.palette = RB, 
               las = 1,
               plot.title = title(main ="Dec 1997", cex.main = 2),
               plot.axes = list(axis(1,seq(100, 160, by = 20), c('100E', NA, '140E', NA)),
                                axis(1, 180,180),
                                axis(1,seq(200, 280, by = 20), c(NA, '140W', NA, '100W', NA)),
                                axis(2,seq(-20, 20, by = 10), c('20S', '10S', 'Eq', '10N', '20N'))),
               key.title = title(main ='degC'))


如果在设置colorRampPalette的colors参数时不知道颜色的名称,也可以采用十六进制颜色编码,颜色编码可以通过rgb函数获得,例如,红色的编码:


其中红色的rgb值(255, 0, 0)既可以从网上搜索,也可以使用QQ或微信截图获得,具体操作方式是,在QQ或微信截图界面下,将鼠标移至某色块上,即自动出现该色块的rgb值。


 更多填色等值线图的绘制请参考R语言:如何在一张图上画多个填色等值线图



版权声明:本文为weixin_40628687原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。