简体   繁体   English

控制R中的栅格值的图例和颜色?

[英]Controlling legend and colors for raster values in R?

I'm trying to plot an ESRI Grid as a raster image of a surface. 我正在尝试将ESRI网格绘制为表面的栅格图像。 I've figured out how to make the plot, but not how to control R's color scale. 我已经弄清楚了如何绘制图,但没有找到如何控制R的色标。

# open necessary libraries
library("raster")
library("rgdal")
library("ncdf")

# goal: select an ESRI Grid ASCII file and plot it as an image.
infile <- file.choose("Results")
r <- raster(infile)

# read in metadata from ESRI output file, split up into relevant variables
info <- read.table(infile, nrows=6) 
NCOLS <- info[1,2]
NROWS <- info[2,2]
XLLCORNER <- info[3,2]
YLLCORNER <- info[4,2]
CELLSIZE <- info[5,2]
NODATA_VALUE <- info[6,2]
XURCORNER <- XLLCORNER+(NCOLS-1)*CELLSIZE
YURCORNER <- YLLCORNER+(NROWS-1)*CELLSIZE

# plot output data - whole model domain
pal <- colorRampPalette(c("purple","blue","cyan","green","yellow","red"))
par(mar = c(5,5,2,4))  # margins for each plot, with room for colorbars
par(pin=c(5,5))  # set size of plots (inches)
par(xaxs="i", yaxs="i")  # set up axes to fit data plotted
plot(r, xlim=c(XLLCORNER, XURCORNER), ylim=c(YLLCORNER, YURCORNER), ylab='UTM Zone 16 N Northing [m]', xlab='UTM Zone 16 N Easting [m]', col = pal(50))

An example of the 'infile' would be something like this: “ infile”的示例如下所示:

NCOLS        262  
NROWS        257  
XLLCORNER     304055.000  
YLLCORNER    4792625.000  
CELLSIZE         10.000  
NODATA_VALUE    -9999.000  
42.4 42.6 42.2 0 42.2 42.8 40.5 40.5 42.5 42.5 42.5 42.9 43.0 ...  
42.5 42.5 42.5 0 0 43.3 42.7 43.0 40.5 42.5 42.5 42.4 41.9 ...  
42.2 42.7 41.9 42.9 0 0 43.7 44.0 42.4 42.5 42.5 43.3 43.2 ...  
42.5 42.5 42.5 42.5 0 0 41.9 40.5 42.4 42.5 42.4 42.4 40.5 ...  
41.9 42.9 40.5 43.3 40.5 0 41.9 42.8 42.4 42.4 42.5 42.5 42.5 ...  
...  

The problem is that the 0 values in the data stretch the color axis beyond what's useful to me. 问题在于数据中的0值使色轴超出了对我有用的范围。 See below: 见下文:

在此处输入图片说明

Basically, I would like to tell R to stretch the color axis from 25-45, rather than 0-50. 基本上,我想告诉R将色轴从25-45拉伸,而不是0-50。 I know in Matlab I would use the command caxis . 我知道在Matlab中我会使用caxis命令。 Does R have something similar? R有类似的东西吗?

I used the dataset "volcano" to generate a raster object, and to make the code reproducible. 我使用数据集“火山”生成一个栅格对象,并使代码可再现。

Ope option is to discretize raster values in classes, then, you can control the range of values in each class. Ope选项是离散化类别中的栅格值,然后,您可以控制每个类别中的值的范围。 Two examples below: 以下是两个示例:

1- plot . 1- 情节

library(raster)
library(RColorBrewer)

r = raster(volcano) #raster object

cuts=c(100,150,160,170,180,190,200) #set breaks
pal <- colorRampPalette(c("white","black"))

plot(r, breaks=cuts, col = pal(7)) #plot with defined breaks

在此处输入图片说明

2- ggplot2 2- ggplot2

library(ggplot2)
library(raster)
library(RColorBrewer)

r = raster(volcano) #raster object
#preparing raster object to plot with geom_tile in ggplot2
r_points = rasterToPoints(r)
r_df = data.frame(r_points)
head(r_df) #breaks will be set to column "layer"
r_df$cuts=cut(r_df$layer,breaks=c(100,150,160,170,180,190,200)) #set breaks

ggplot(data=r_df) + 
  geom_tile(aes(x=x,y=y,fill=cuts)) + 
  scale_fill_brewer("Legend_title",type = "seq", palette = "Greys") +
  coord_equal() +
  theme_bw() +
  theme(panel.grid.major = element_blank()) +
  xlab("Longitude") + ylab("Latitude")

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM