使用Lattice包wireframe()绘制剖面时色条显示异常求助
解决Lattice wireframe()地形剖面色条异常的问题
我懂你现在的困扰——用wireframe()画地形剖面时,色条变成了完全不符合预期的粉红色,和你想要的“海洋蓝+陆地灰”配色差得老远。别着急,我们来搞定这个问题:
问题出在哪?
你用get.box()拿到的bathy对象直接传给wireframe()时,它压根没继承你在plot(Bathy2)里设置的bpal配色规则,而是用了lattice默认的颜色映射。这个默认映射不会区分地形的正负值(陆地是正、海洋是负),所以才搞出了奇怪的粉红色色条。
怎么解决?
我们得手动给wireframe()指定和地形数据匹配的颜色映射,具体分三步:
- 把bathy对象转成数据框,这样更容易控制颜色
- 做一个自定义配色函数,让负值(海洋)用蓝色系,正值(陆地)用灰色系
- 在
wireframe()里明确指定颜色和色条的设置,让它们和配色规则对应上
修改后的完整代码
require(marmap) require(lattice) require(ggplot2) # 用来把bathy对象转成数据框 # 获取地形数据 Bathy2 <- getNOAA.bathy(lon1 = 30, lon2 = 47, lat1 = -12, lat2 = -28, resolution = 2) # 绘制区域地图+剖面线 plot(Bathy2, image=TRUE, land = TRUE, lwd = 0.03, bpal = list(c(0, max(Bathy2), greys), c(min(Bathy2), 0, blues))) belt3 <- get.box(Bathy2, x1 = 34, x2 = 46, y1 = -20, y2 = -20, width = 3, col = "red") # 把bathy对象转换成数据框格式 belt3_df <- fortify.bathy(belt3) # 提取z值的最大最小值,用来设置颜色区间 z_range <- range(belt3_df$z, na.rm = TRUE) z_min <- z_range[1] z_max <- z_range[2] # 创建自定义配色:从蓝色(海洋)渐变到灰色(陆地) color_palette <- colorRampPalette(c(blues(100), greys(100))) # 设置颜色断点,以0为海陆分界点 color_breaks <- c(seq(z_min, 0, length.out = 100), seq(0, z_max, length.out = 100)) # 绘制3D剖面 wireframe(z ~ x + y, data = belt3_df, shade = TRUE, zoom = 1.1, aspect = c(1/4, 0.1), screen = list(z = -60, x = -55), par.settings = list(axis.line = list(col = "white")), par.box = c(col = rgb(0, 0, 0, 0.1)), xlab = "", col.regions = color_palette(length(color_breaks)-1), colorkey = list(at = color_breaks, labels = list(at = c(z_min, 0, z_max))))
重点说明
fortify.bathy(belt3):marmap的bathy对象是特殊格式,转成数据框后lattice才能更好地处理颜色映射colorRampPalette(c(blues(100), greys(100))):和你之前plot()里的配色逻辑完全一致,海洋用蓝色,陆地用灰色col.regions:告诉wireframe()用我们自定义的颜色填充地形colorkey的at参数:让色条的刻度和颜色区间对应,确保色条能正确展示从海洋到陆地的颜色渐变
这样调整后,色条就会显示正常的蓝灰渐变,和你一开始的地图配色统一啦。
内容的提问来源于stack exchange,提问作者Strobila
相关产品推荐
相关产品推荐

