Search code examples
pythonmatplotlibcoordinate-systemshexagonal-tiles

How to properly draw hexagons with offset coordinates?


This is my code:

import matplotlib.pyplot as plt
from matplotlib.patches import RegularPolygon
import numpy as np


offCoord = [[-2,-2],[-1,-2],[0,-2],[1,-2],[2,-2]]

fig, ax = plt.subplots(1)
ax.set_aspect('equal')

for c in offCoord:
    hex = RegularPolygon((c[0], c[1]), numVertices=6, radius=2./3., alpha=0.2, edgecolor='k')
    ax.add_patch(hex)
plt.autoscale(enable = True)
plt.show()

Expected result vs actual result in the attached image

Expected result vs actual result

Please tell me why my hexagons are not lined up edge by edge but overlap each other? What am I doing wrong?


Solution

  • Use law of cosines (for isosceles triangle with angle 120 degrees and sides r, r, and 1):

    1 = r*r + r*r - 2*r*r*cos(2pi/3) = r*r + r*r + r*r = 3*r*r
    
    r = sqrt(1/3)
    

    triangle

    This is the right code:

    import matplotlib.pyplot as plt
    from matplotlib.patches import RegularPolygon
    import numpy as np
    
    
    offCoord = [[-2,-2],[-1,-2],[0,-2],[1,-2],[2,-2]]
    
    fig, ax = plt.subplots(1)
    ax.set_aspect('equal')
    
    for c in offCoord:
        # fix radius here
        hexagon = RegularPolygon((c[0], c[1]), numVertices=6, radius=np.sqrt(1/3), alpha=0.2, edgecolor='k')
        ax.add_patch(hexagon)
    plt.autoscale(enable = True)
    plt.show()