Search code examples
pythonmatplotlibplotcustomization

Matplotlib - create a scatter plot with points that fill the available space


I can create a scatter plot as follows:

fig, ax = plt.subplots()
x1 = [1, 1, 2]
y1 = [1, 2, 1]
x2 = [2]
y2 = [2]
ax.scatter(x1, y1, color="red", s=500)
ax.scatter(x2, y2, color="blue", s=500)

which gives

enter image description here

What I would like is something like the following (apologies for poor paint work):

enter image description here

I am plotting data that is all integer values, so they're all on a grid. I would like to be able to control the size of the scatter marker so that I could have white space around the points, or I could make the points large enough such that there would be no white space around them (as I have done in the above paint image).

Note - ideally the solution will be in pure matplotlib, using the OOP interface as they suggest in the documentation.


Solution

  • import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    # X and Y coordinates for red circles
    red_xs = [1,2,3,4,1,2,3,4,1,2,1,2]
    red_ys = [1,1,1,1,2,2,2,2,3,3,4,4]
    
    # X and Y coordinates for blue circles
    blu_xs = [3,4,3,4]
    blu_ys = [3,3,4,4]
    
    # Plot with a small markersize
    markersize = 5
    fig, ax = plt.subplots(figsize=(3,3))
    ax.plot(red_xs, red_ys, marker="o", color="r", linestyle="", markersize=markersize)
    ax.plot(blu_xs, blu_ys, marker="o", color="b", linestyle="", markersize=markersize)
    plt.show()
    

    smallmarkers

    # Plot with a large markersize
    markersize = 50
    fig, ax = plt.subplots(figsize=(3,3))
    ax.plot(red_xs, red_ys, marker="o", color="r", linestyle="", markersize=markersize)
    ax.plot(blu_xs, blu_ys, marker="o", color="b", linestyle="", markersize=markersize)
    plt.show()
    

    enter image description here

    # Plot with using patches and radius
    r = 0.5
    fig, ax = plt.subplots(figsize=(3,3))
    for x, y in zip(red_xs, red_ys):
        ax.add_patch(mpl.patches.Circle((x,y), radius=r, color="r"))
    for x, y in zip(blu_xs, blu_ys):
        ax.add_patch(mpl.patches.Circle((x,y), radius=r, color="b"))
    ax.autoscale()
    plt.show()
    

    enter image description here