Skip to content

spplot handling of overlapping points?

16 messages · MacQueen, Don, Zia Ahmed, Barry Rowlingson +4 more

#
I have a SpatialPointsDataFrame object in which many points are very close
together, such that the markers (plotting characters) tend to overlap. (Of
course, this depends on marker size and the scale at which I plot; if I
"zoom in" there is less overlap.)

It appears that when markers overlap, spplot() places a marker associated
with the larger value after, and therefore on top of, a marker associated
with a smaller value.

Am I correct? Or more generally, what is the algorithm that determines the
order in which markers are added?


I have searched ?spplot and related help pages and haven't found an
explanation (at least, not yet).

I can add that I don't believe markers are placed in the order in which
they appear in the SpatialPointsDataFrame. I say this because when I
attempt to reproduce an spplot using base graphics plot() I have to sort
from smallest to largest value to succeed.

I can probably provide a small reproducible example if necessary, but I'm
hoping it's not necessary.

Here are my actual commands.

  tmps is the SpatialPointsDataFrame.
  tmp is coordinates(tmps)
(they have the same number of rows in the same order)

Note that I'm using the cuts argument to break a continuous variable
('cpm2') into bins. I have carefully matched the colors in tmps$col2 with
the cbin.cols object passed to spplot(), and the break points for the bin
boundaries, so I believe that everything else that could affect the final
appearance, other than the order in which the markers are placed, is
controlled.

#1 using spplot
spplot(tmps,c('cpm2'),
   key.space='right',
   legendEntries=cbin.lbls,
   cuts=cbin.brks,
   col.regions=cbin.cols,
   cex=0.4)

#2 using base graphics
plot(tmp[,1],tmp[,2], asp=1, cex=0.6, pch=16, col=tmps$col2)



Thanks
-Don
#
Don,

spplot essentially does this:

df = data.frame(x=runif(100),y=runif(100),z=rnorm(100))
library(lattice)
xyplot(y~x,groups=cut(df$z,5),df,pch=16,cex=5, col=grey((1:5)/6),
  asp="iso")

for SpatialPointsDataFrame objects. So yes, it seems that the plotting
order is determined by value.

I guess that what you would have liked is the data order, i.e.

xyplot(y~x,col=grey((1:5)/6)[cut(df$z,5)],df,pch=16,cex=5)

and I think that is more reasonable to expect (and would allow for
randomization).

Best regards,
On 03/02/2012 09:03 PM, MacQueen, Don wrote:

  
    
2 days later
#
This has now been changed/repared in sp on r-forge (svn), and will
appear from sp 0.9-97 on. A test run would be:

library(sp)
xyz = data.frame(expand.grid(x=1:10,y=1:10),rnorm(100))
coordinates(xyz)=~x+y
spplot(xyz, cex=10)

which used to plot points in value order, and does now in data record order.

I put up resulting graphs, for comparison, at
http://ifgi.uni-muenster.de/~epebe_01/xyz.html

As this change may make some of your spplot's for points different, if
there are objections against this change (which I consider an
improvement, if not a bug fix), it is time now to let me / us know.
On 03/02/2012 09:03 PM, MacQueen, Don wrote:

  
    
#
Edzer,

I think you've done the right thing -- and thank you for the quick
response.

Ironically, in the application that brought this up plotting higher values
on top was convenient, because higher values are of more interest.
However, I can still have higher values on top simply by sorting before
plotting. The user now has more control, and this is good.

-Don
#
On 03/05/2012 04:36 PM, MacQueen, Don wrote:
Right, the old behaviour is obtained by reordering the data, as in:

library(sp)
xyz = data.frame(expand.grid(x=1:10,y=1:10), z = rnorm(100))
coordinates(xyz)=~x+y
spplot(xyz[order(xyz$z),], cex=10)
#
Is there anyway to calculate population weighted centroids of a spatial 
polygon   in R? Any idea will be appreciated. Thanks
Zia
#
On Tue, Mar 6, 2012 at 1:49 AM, Zia Ahmed <zua3 at cornell.edu> wrote:
Some more clues would be appreciated! What's your data? A set of
points representing cities with populations and an additional set of
polygons? Or a raster population density and a set of polygons? Or
something else?

 Either way it can be done, but unless you tell us more precisely what
your problem is we'll all be wasting our time!

Barry
#
On 05/03/12 14:40, Edzer Pebesma wrote:
Would it be possible to set a degree of transparency  for the 
overlapping points in spplot ?

Thanks in advance,

Mauricio Zambrano-Bigiarini
-
=======================================================
FLOODS Action
Water Resources Unit (H01)
Institute for Environment and Sustainability (IES)
European Commission, Joint Research Centre (JRC)
webinfo    : http://floods.jrc.ec.europa.eu/
=======================================================
DISCLAIMER:
"The views expressed are purely those of the writer
and may not in any circumstances be regarded as stating
an official position of the European Commission."
=======================================================
Linux user #454569 -- Ubuntu user #17469
=======================================================
"If Columbus had turned back, no one would have blamed him.
Of course, no one would have remembered him either."
(Source Unknown)
-
#
Yes, look for argument alpha e.g. in ?rgb or ?bpy.colors
On 03/06/2012 04:49 PM, Mauricio Zambrano-Bigiarini wrote:

  
    
#
On 06/03/12 16:55, Edzer Pebesma wrote:
Thank you very much Edzer. It works perfectly:

library(sp)
xyz = data.frame(expand.grid(x=1:10,y=1:10),rnorm(100))
coordinates(xyz)=~x+y
spplot(xyz, cex=10, alpha=0.7)

Cheers,

Mauricio
5 days later