2016-03-20 8 views
5

Ich möchte Voronoi Polygone mit Farben auf einer Variablen (z in meinem Fall) füllen. Hier ist der Code:Füllen Voronoi Polygone mit ggplot

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([email protected][,1], [email protected][,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 <- [email protected] 

    # 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) 

Jetzt habe ich dieses Bild:

enter image description here

Ich möchte, dass jedes Polygon sollte basierend auf dem Wert der Variablen z auf einer Farbskala abgebildet werden ... wie kann ich mach das?? Vielen Dank!!!

+0

bezogen werden: http://stackoverflow.com/questions/5608381/plotting-and-coloring-data-on-irregular-grid (aber ich fand nie eine voll befriedigende Antwort) – baptiste

+0

siehe auch: http://stackoverflow.com/a/24312134/471093 – baptiste

+0

und die [gazetools] (http://finzi.psych.upenn.edu/library/gazetools/ html/geom_voronoi.html) Paket hatte anscheinend ein Geom dafür – baptiste

Antwort

5

Soweit ich weiß, können Sie nicht einen Vektor verwenden, der nicht die gleiche Länge wie das Datenproblem selbst hat (in diesem Fall die Anzahl der Zeilen in vor_df), um Füllfarben anzugeben. Wenn ich jedoch die Annahme mache, dass jedes der Elemente von z auf die ID einer Form von vor_df angewendet werden soll, könnten Sie dies tun;

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

Dies bildet die id Spalte als Farbe zu jedem Polygon. Es sollte einfach genug sein, eine separate Spalte hinzuzufügen, um einen Wert für jede ID basierend auf Vektor z hinzuzufügen, wenn Sie es in der Legende oder in einer Anzahl anderer Dinge benötigen.

Obwohl dies alles unter der Annahme ist, dass jeder id direkt korreliert mit einer Zahl aus Vektor z.

0

einfach tileplot in latticeExtra Paket verwenden:

library(deldir) 
library(latticeExtra) 

tileplot(z~x*y, dati) 

here is the output