johndaniel
johndaniel

Reputation: 139

Joining the points in a scatter plot

I’ve a scatter plot which almost looks like a circle. I would like to join the outer points with a line to show that almost circle like shape. Is there a way to do that in matplotlib?

Upvotes: 1

Views: 884

Answers (1)

Thomas Kühn
Thomas Kühn

Reputation: 9830

You can use ConvexHull from scipy.spatial to find the outer points of your scatter plot and then connect these points using a PolyCollection from matplotlib.collections:

from matplotlib import pyplot as plt
import numpy as np
from scipy.spatial import ConvexHull
from matplotlib.collections import PolyCollection


fig, ax = plt.subplots()

length = 1000

#using some normally distributed data as example:
x = np.random.normal(0, 1, length)
y = np.random.normal(0, 1, length)

points = np.concatenate([x,y]).reshape((2,length)).T
hull = ConvexHull(points)



ax.scatter(x,y)

ax.add_collection(PolyCollection(
    [points[hull.vertices,:]],
    edgecolors='r',
    facecolors='w',
    linewidths=2,
    zorder=-1,
    ))



plt.show()

The result looks like this:

result of the given code

EDIT

Actually, you can skip the PolyCollection and just do a simple line plot using the hull vertices. You only have to make the line circular by appending the first vertex to the list of vertices (making that list one element longer):

circular_hull_verts = np.append(hull.vertices,hull.vertices[0])
ax.plot(
    x[circular_hull_verts], y[circular_hull_verts], 'r-', lw=2, zorder=-1, 
    )

EDIT 2:

I noticed that there is an example in the scipy documentation that looks quite similar to mine.

Upvotes: 5

Related Questions