2016-03-20 32 views
5

ile doldurun voronoi çokgenleri bir değişkene dayalı renklerle doldurmak istiyorum (durumumda z).voronoi çokgenleri 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) 

Şimdi bu görüntü var:

enter image description here

Her poligon değişken z değerine dayalı bir renk skalası eşlenmesi gerektiğini istiyorum nasıl can ... İşte kod ben bunu yaparım?? Teşekkürler!!!

+0

related: http://stackoverflow.com/questions/5608381/plotting-and-coloring-data-on-irregular-grid (ama asla tatmin edici bir cevap bulamadım: – baptiste

+0

ayrıca bkz: http://stackoverflow.com/a/24312134/471093 – baptiste

+0

ve [gazetools] (http://finzi.psych.upenn.edu/library/gazetools/ html/geom_voronoi.html) paketinin bunun için bir geom olduğu anlaşılıyor – baptiste

cevap

5

Bildiğim kadarıyla, dolgu renklerini belirtmek için veri sorununun kendisi ile aynı uzunlukta olmayan bir vektör (bu durumda vor_df'daki satır sayısı) kullanamazsınız. Ancak, z öğesinden her öğenin vor_df biçimine uygulanacağını varsayarak bunu yapabilirdiniz;

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

Bu bir renk olarak her poligon id sütununu. Efsaneye veya başka bir sayıya ihtiyacınız varsa, z numaralı telefona göre her bir kimlik için bir değer eklemek için ayrı bir sütun eklemek yeterince kolay olmalıdır. Bununla birlikte, bu her bir id'un doğrudan z vektöründen bir sayı ile ilişkili olduğu varsayımına dayanmaktadır.

0

Basitçe latticeExtra pakette tileplot kullanın:

library(deldir) 
library(latticeExtra) 

tileplot(z~x*y, dati) 

here is the output