簡體   English   中英

用ggplot填充voronoi多邊形

[英]Fill voronoi polygons with ggplot

我想用基於變量的顏色填充voronoi多邊形(在我的情況下為z)。 這是代碼:

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)

現在我有這個圖像:

在此輸入圖像描述

我希望每個多邊形都應該根據變量z的值映射到顏色標度...我該怎么做? 謝謝!!!

據我所知,您不能使用與數據問題本身長度不同的向量(在本例中為vor_df的行vor_df )來指定填充顏色。 但是,如果我假設z中的每個元素都應用於vor_df中的形狀id,那么你可以這樣做;

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

在此輸入圖像描述

這會將id列作為顏色映射到每個多邊形。 如果你需要在圖例中或任何其他數量的東西中添加一個單獨的列來為每個id添加一個基於向量z的值應該很容易。

但是,這都假設每個id直接與向量z的數字相關。

只需在latticeExtra包中使用tileplot

library(deldir)
library(latticeExtra)

tileplot(z~x*y, dati)

這是輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM