[R-sig-Geo] Scale Bar

Roger Bivand Roger.Bivand at nhh.no
Fri May 2 11:29:37 CEST 2008

On Thu, 1 May 2008, PUJAN RAJ REGMI wrote:

> Dear,

> I followed the instruction given by Roger. But i got the following error 
> message; coordinates(A) <- c("x", "y")> gridded(A) <- TRUE> 
> greenchannel<-matrix(A[,3],nrow=155,ncol=191,byrow=TRUE)Error in 
> as.vector(x, mode) : cannot coerce to 
> vectorredchannel<-matrix(A[,4],nrow=155,ncol=191,byrow=TRUE)Error in 
> as.vector(x, mode) : cannot coerce to vector> 
> nearinfraredchannel<-matrix(A[,5],nrow=155,ncol=191,byrow=TRUE)Error in 
> `[.data.frame`(x at data, i, j, ..., drop = FALSE) :  undefined columns 
> selected> 
> midinfraredchannel<-matrix(A[,6],nrow=155,ncol=191,byrow=TRUE)Error in 
> `[.data.frame`(x at data, i, j, ..., drop = FALSE) :  undefined columns 
> selectedThe image plot was black background with x and y axis values.

You are not reading what is being sent to you carefully enough, but at 
least this is a fresh thread, so some progress. Above, you have mixed up 
my answer with your own attempt to use rimage classes and functions. If 
you have spatial data, use spatial classes and functions, which permit 
integration with other spatial data.

Using the data you sent me offline (but *.rar compressed, please use gzip 
or zip, rar is not portable), I have:

A <- read.table("test.txt", skip=8, header=FALSE)
names(A) <- c("x", "y", "greenchannel", "redchannel",
   "nearinfraredchannel", "midinfraredchannel")
coordinates(A) <- c("x", "y")
gridded(A) <- TRUE

I note that you have not given the projection of your data (UTM?), so 
registering this data with other data (stream channel patterns?) is not 
made any easier.

A$red <- as.double(A$nearinfraredchannel)
A$green <- as.double(A$redchannel)
A$blue <- as.double(A$greenchannel)

The values appear to be in the 0-255 range, but do not go much beyond 
halfway - do they need stretching? Muliplying the values by 1.79 -
1/(max(c(A$red, A$green, A$blue))/255) rounded down a touch - gave a more 
pleasing image, but I don't know the origins of your data.

image(A, red="red", green="green", blue="blue", axes=TRUE)

which shows the majority of your study area as 0 coded black, and the 
remainder is not very differentiated. It ought to be possible to code 
these 0 values as NA, but currently the underlying method in sp does not 
handle NAs gracefully for rgb input - this will be improved in the next 
release. So, we recode 0 as 255 to get white:

A$red <- ifelse(A$red < 1, 255, A$red)
A$green <- ifelse(A$green < 1, 255, A$green)
A$blue <- ifelse(A$blue < 1, 255, A$blue)
image(A, red="red", green="green", blue="blue", axes=TRUE)

So now to your scale bar:

SpatialPolygonsRescale(layout.scale.bar(), offset = c(566500, 5698000),
  scale = 500, fill=c("transparent","black"), plot.grid=FALSE)
text(566500, 5698075, "0", cex=0.7)
text(567000, 5698075, "500 m", cex=0.7)

You can complete the north arrow in the same way using examples on the 
help page for spplot, if you really want one.

Finally, as a geographer, I would point out that the scale bar and north 
arrow are not needed when the axes show the scale and the direction of 
north. Anyone who tells you that they have to be there (your supervisor?), 
should read up on analytical graphics - extra details distract attention 
from what the data are saying. Probably using grid() is less intrusive, 
and gives good placing control across the whole graphic. When was the last 
time anyone actually used a map scale bar to read off distances from a 


> Any help?
> Thanking you
> Pujan
> _________________________________________________________________
> Back to work after baby–how do you know when you’re ready?
> 5797498&ocid=T067MSN40A0701A
> 	[[alternative HTML version deleted]]

Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no

More information about the R-sig-Geo mailing list