0

I would really appreciate it if someone can help me with the code below. I am trying to plot Voronoi cells for some random data points and I want to assign some colours. The to reproduce my work is provided below. As you can see in the plot, there are thick lines. I completely want to eliminate those lines. Is there any way to get rid of them? I want to fill the polygon but not have the line. Any recommendation is greatly appreciated.

I took most of the code from here

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi
import pandas as pd

def voronoi_finite_polygons_2d(vor, radius=None):
"""
Reconstruct infinite voronoi regions in a 2D diagram to finite
regions.

Parameters
----------
vor : Voronoi
    Input diagram
radius : float, optional
    Distance to 'points at infinity'.

Returns
-------
regions : list of tuples
    Indices of vertices in each revised Voronoi regions.
vertices : list of tuples
    Coordinates for revised Voronoi vertices. Same as coordinates
    of input vertices, with 'points at infinity' appended to the
    end.

"""

if vor.points.shape[1] != 2:
    raise ValueError("Requires 2D input")

new_regions = []
new_vertices = vor.vertices.tolist()

center = vor.points.mean(axis=0)
if radius is None:
    radius = vor.points.ptp().max()

# Construct a map containing all ridges for a given point
all_ridges = {}
for (p1, p2), (v1, v2) in zip(vor.ridge_points, vor.ridge_vertices):
    all_ridges.setdefault(p1, []).append((p2, v1, v2))
    all_ridges.setdefault(p2, []).append((p1, v1, v2))

# Reconstruct infinite regions
for p1, region in enumerate(vor.point_region):
    vertices = vor.regions[region]

    if all(v >= 0 for v in vertices):
        # finite region
        new_regions.append(vertices)
        continue

    # reconstruct a non-finite region
    ridges = all_ridges[p1]
    new_region = [v for v in vertices if v >= 0]

    for p2, v1, v2 in ridges:
        if v2 < 0:
            v1, v2 = v2, v1
        if v1 >= 0:
            # finite ridge: already in the region
            continue

        # Compute the missing endpoint of an infinite ridge

        t = vor.points[p2] - vor.points[p1] # tangent
        t /= np.linalg.norm(t)
        n = np.array([-t[1], t[0]])  # normal

        midpoint = vor.points[[p1, p2]].mean(axis=0)
        direction = np.sign(np.dot(midpoint - center, n)) * n
        far_point = vor.vertices[v2] + direction * radius

        new_region.append(len(new_vertices))
        new_vertices.append(far_point.tolist())

    # sort region counterclockwise
    vs = np.asarray([new_vertices[v] for v in new_region])
    c = vs.mean(axis=0)
    angles = np.arctan2(vs[:,1] - c[1], vs[:,0] - c[0])
    new_region = np.array(new_region)[np.argsort(angles)]

    # finish
    new_regions.append(new_region.tolist())

return new_regions, np.asarray(new_vertices)


# make up data points
np.random.seed(1234)
points = np.random.rand(12, 2)

df = pd.DataFrame(points, columns=list('XY'))


df[["Name"]] = [chr(i+65) for i in df.index]

# compute Voronoi tesselation
vor = Voronoi(points)

# plot
regions, vertices = voronoi_finite_polygons_2d(vor)

cluster_color_dit = {
  "A": "orange",
  "B": "red",
  "C": "red",
  "D": "red",
  "E": "blue",
  "F": "blue",
  "G": "blue",
  "H": "blue",
  "I": "red",
  "J": "red",
  "K": "purple",
  "L" : "blue"

}




fig, ax = plt.subplots()

cluster_color_dit[df.Name[0]]

for j, region in enumerate(regions):
    polygon = vertices[region]
    color = cluster_color_dit[df.Name[j]]
    plt.fill(*zip(*polygon), alpha=0.4, color = color)
        

plt.plot(points[:,0], points[:,1], 'ko')
plt.xlim(vor.min_bound[0] - 0.1, vor.max_bound[0] + 0.1)
plt.ylim(vor.min_bound[1] - 0.1, vor.max_bound[1] + 0.1)
plt.show()

enter image description here

boniface316
  • 489
  • 3
  • 17

1 Answers1

1

You can pass linewidth=0 to plt.fill() to get rid of the lines.

yut23
  • 2,624
  • 10
  • 18