Fill voronoi polygons with ggplot

I want to fill voronoi polygons with colors based on a variable (z in my case). Here is the code:

library(rgdal) library(deldir) library(dplyr) library(ggplot2) library(UScensus2010) x<-c(0,55,105,165,270,65,130,155,155,225,250,295, 30,100,110,135,160,190,230,300,30,70,105,170, 210,245,300,0,85,175,300,15,60,90,90,140,210, 260,270,295,5,55,55,90,100,140,190,255,285,270) y<-c(305,310,305,310,310,260,255,265,285,280,250, 260,210,240,225,225,225,230,210,215,160,190, 190,175,160,160,170,120,135,115,110,85,90,90, 55,55,90,85,50,50,25,30,5,35,15,0,40,20,5,150) z<-c(870,793,755,690,800,800,730,728,710,780,804, 855,813,762,765,740,765,760,790,820,855,812, 773,812,827,805,840,890,820,873,875,873,865, 841,862,908,855,850,882,910,940,915,890,880, 870,880,960,890,860,830) dati<-data.frame(x,y,z) vor_pts <- SpatialPointsDataFrame(cbind(dati$x,dati$y),dati, match.ID=TRUE) SPointsDF_to_voronoi_SPolysDF <- function(sp) { # tile.list extracts the polygon data from the deldir computation vor_desc <- tile.list(deldir( sp@coords [,1], sp@coords [,2])) lapply(1:(length(vor_desc)), function(i) { # tile.list gets us the points for the polygons but we # still have to close them, hence the need for the rbind tmp <- cbind(vor_desc[[i]]$x, vor_desc[[i]]$y) tmp <- rbind(tmp, tmp[1,]) # now we can make the Polygon(s) Polygons(list(Polygon(tmp)), ID=i) }) -> vor_polygons # hopefully the caller passed in good metadata! sp_dat <- sp@data # this way the IDs _should_ match up w/the data & voronoi polys rownames(sp_dat) <- sapply(slot(SpatialPolygons(vor_polygons), 'polygons'), slot, 'ID') SpatialPolygonsDataFrame(SpatialPolygons(vor_polygons), data=sp_dat) } vor <- SPointsDF_to_voronoi_SPolysDF(vor_pts) vor_df <- fortify(vor) ggplot() + geom_point(data = dati, aes(x, y), shape=21, color = "white", fill = "steel blue") + geom_map(data = vor_df, map = vor_df, aes(x = long, y = lat, map_id = id), color = "#a5a5a5", fill = "#FFFFFF00", size = 0.25) 

Now I have this image:

enter image description here

I want each polygon to be displayed in the color scale based on the value of the z variable ... how can I do this? Thanks!!!

+5
source share
2 answers

As far as I know, you cannot use a vector that is not the same length as the data problem itself (in this case, the number of lines in vor_df ) to indicate the fill colors. However, if I make the assumption that each element from z should apply to the form identifier from vor_df , you can do this:

 ggplot() + geom_map(data=vor_df, map=vor_df,aes(x=long, y=lat, map_id=id, fill = id), size=0.25) + geom_path(data=vor_df,aes(x=long, y=lat, map=id)) + geom_point(data = dati, aes(x, y),shape=21, color="white", fill="steelblue") 

enter image description here

Displays the id column for each polygon as a color. Simply add a separate column to add a value to each id based on the vector z , if you need it in a legend or in any number of other things.

Although, this is all based on the assumption that each id directly correlates with a number from the vector z .

+5
source

Just use tileplot in the latticeExtra package:

 library(deldir) library(latticeExtra) tileplot(z~x*y, dati) 

here is the result

0
source

Source: https://habr.com/ru/post/1245401/


All Articles