# Voronoi Polygons for 2-D Point Sets¶

Author: Serge Rey (http://github.com/sjsrey)

## Basic Usage¶

[1]:

import sys
import os
sys.path.append(os.path.abspath('..'))
import libpysal

[2]:

from libpysal.cg.voronoi  import voronoi, voronoi_frames

[3]:

points = [(10.2, 5.1), (4.7, 2.2), (5.3, 5.7), (2.7, 5.3)]

[4]:

regions, vertices = voronoi(points)

[5]:

regions

[5]:

[[1, 3, 2], [4, 5, 1, 0], [0, 1, 7, 6], [9, 0, 8]]

[6]:

vertices

[6]:

array([[  4.21783296,   4.08408578],
[  7.51956025,   3.51807539],
[  9.4642193 ,  19.3994576 ],
[ 14.98210684, -10.63503022],
[ -9.22691341,  -4.58994414],
[ 14.98210684, -10.63503022],
[  1.78491801,  19.89803294],
[  9.4642193 ,  19.3994576 ],
[  1.78491801,  19.89803294],
[ -9.22691341,  -4.58994414]])

[7]:

region_df, point_df = voronoi_frames(points)

[8]:

%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

[9]:

fig, ax = plt.subplots()
region_df.plot(ax=ax, color='blue',edgecolor='black', alpha=0.3)
point_df.plot(ax=ax, color='red')


[9]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f3304d59e48>


## Larger Problem¶

[10]:

n_points = 200
np.random.seed(12345)
points = np.random.random((n_points,2))*10 + 10
results = voronoi(points)
mins = points.min(axis=0)
maxs = points.max(axis=0)

[11]:

regions, vertices = voronoi(points)

[12]:

regions_df, points_df = voronoi_frames(points)

[13]:

fig, ax = plt.subplots()
points_df.plot(ax=ax, color='red')

[13]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f32fd486b38>

[14]:

fig, ax = plt.subplots()
regions_df.plot(ax=ax, color='blue',edgecolor='black', alpha=0.3)
points_df.plot(ax=ax, color='red')

[14]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f32fd3c76a0>


## Trimming¶

[15]:

points = np.array(points)
maxs = points.max(axis=0)
mins = points.min(axis=0)
xr = maxs[0] - mins[0]
yr = maxs[1] - mins[1]
buff = 0.05
r = max(yr, xr) * buff
minx = mins[0] - r
miny = mins[1] - r
maxx = maxs[0] + r
maxy = maxs[1] + r

[16]:

fig, ax = plt.subplots()
regions_df.plot(ax=ax, edgecolor='black', facecolor='blue', alpha=0.2 )
points_df.plot(ax=ax, color='red')
plt.xlim(minx, maxx)
plt.ylim(miny, maxy)
plt.title("buffer: %f, n: %d"%(r,n_points))
plt.show()



# Voronoi Weights¶

[17]:

from libpysal.weights.contiguity import Voronoi as Vornoi_weights

[18]:

w = Vornoi_weights(points)

[19]:

w.n

[19]:

200

[20]:

w.pct_nonzero

[20]:

2.685

[21]:

w.histogram

[21]:

[(1, 1),
(2, 6),
(3, 17),
(4, 34),
(5, 41),
(6, 63),
(7, 24),
(8, 7),
(9, 5),
(10, 1),
(11, 0),
(12, 1)]

[22]:

idx = [i for i in range(w.n) if w.cardinalities[i]==12]

[23]:

points[idx]

[23]:

array([[16.50851787, 13.12932895]])

[ ]: