[R-sig-Geo] How can I plot categorical raster (using levelplot?) with a proper legend?

Mikhail Titov mlt at gmx.us
Tue Apr 30 18:30:18 CEST 2013


Hi, all!

I have a raster exported from ArcMap that I'm trying to plot (for now)
with raster/rasterVis. But the problem is that levelplot fails to plot
raster as is. When I deratify it first, it plots, but the legend is
incorrect :( The manual for rasterVis says to use ratify for categorical
data, but calling ratify makes no difference for me.

I feel like I'm missing something... Here is the code I was using.

,----[ loading data ]
| library(raster)
| library(rasterVis)
| library(foreign)
| fname <- "too-big-to-attach.img"
| benefits.rast <- raster(fname)
| rat <- read.dbf(paste(fname, ".vat.dbf", sep=""))
| names(rat)[1] <- "ID"                   # rename Value to ID
| levels(benefits.rast) <- rat
| levels(benefits.rast)
`----

This yields in my case

,----[ levels(benefits.rast) ]
| [[1]]
|   ID Count class
| 1  0  3616     D
| 2  1  2476     R
| 3  2 11584     C
| 4  3   305    NB
| 5  4    60    D-
| 6  5  1912     B
| 7  6    57    SA
| 8  7   151     A
`----

At this point if I call levelplot(benefits.rast), nothing is being
plotted and I get the following error.

,----[ Error from levelplot(benefits.rast) ]
| Error in from:to : result would be too long a vector
| In addition: Warning messages:
| 1: In min(x) : no non-missing arguments to min; returning Inf
| 2: In max(x) : no non-missing arguments to max; returning -Inf
| 3: In min(x) : no non-missing arguments to min; returning Inf
| 4: In max(x) : no non-missing arguments to max; returning -Inf
`----

However the following code does produce a plot but with messed up legend
items. Here is how it looks http://i.troll.ws/55d45652.png . Something
yellowish that looks like a road should be 'R'.

,----[ The following results in a messed up legend ]
| benefits.cat <- deratify(benefits.rast, "class")
| levelplot(benefits.cat)                 # from rasterVis
`----

,----[ The following results in a proper plot but with IDs ]
| benefits.cat <- deratify(benefits.rast, "ID")
| levelplot(benefits.cat)                 # from rasterVis
`----

An here is an experiment with ratify

,----[ try ratify ]
| benefits.cat <- ratify(benefits.rast)
| levelplot(benefits.cat)                 # from rasterVis
`----

That gives me

,----
| Error in .checkLevels(levels(x)[[1]], value) : 
|   the number of columns in the raster attributes (factors) data.frame should be > 1
`----

-- 
Mikhail



More information about the R-sig-Geo mailing list