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

来源:互联网 发布:天气软件找不到列治文 编辑:程序博客网 时间:2024/06/06 04:16

更多填色等值线图的绘制请参考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_12filled.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 <- 12col <- 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语言:如何在一张图上画多个填色等值线图


原创粉丝点击