title: Matplotlib RegularPolygon collection location on the canvas
body: <p>I am trying to plot a feature map (SOM) using python.
  To keep it simple, imagine a 2D plot where each unit is represented as an hexagon.</p>
  
  <p>As it is shown on this topic: <a href="https://stackoverflow.com/questions/2334629/hexagonal-self-organizing-map-in-python/23689112#23689112">Hexagonal Self-Organizing map in Python</a> the hexagons are located side-by-side formated as a grid.</p>
  
  <p>I manage to write the following piece of code and it works perfectly for a set number of polygons and for only few shapes (6 x 6 or 10 x 4 hexagons for example). However one important feature of a method like this is to support any grid shape from 3 x 3.</p>
  
  <pre><code>def plot_map(grid,
               d_matrix,
               w=10,
               title='SOM Hit map'):
      """
      Plot hexagon map where each neuron is represented by a hexagon. The hexagon
      color is given by the distance between the neurons (D-Matrix) Scaled
      hexagons will appear on top of the background image whether the hits array
      is provided. They are scaled according to the number of hits on each
      neuron.
  
      Args:
      - grid: Grid dictionary (keys: centers, x, y ),
      - d_matrix: array contaning the distances between each neuron
      - w: width of the map in inches
      - title: map title
  
      Returns the Matplotlib SubAxis instance
      """
      n_centers = grid['centers']
      x, y = grid['x'], grid['y']
      fig = plt.figure(figsize=(1.05 * w,  0.85 * y * w / x), dpi=100)
      ax = fig.add_subplot(111)
      ax.axis('equal')
      # Discover difference between centers
      collection_bg = RegularPolyCollection(
          numsides=6,  # a hexagon
          rotation=0,
          sizes=(y * (1.3 * 2 * math.pi * w) ** 2 / x,),
          edgecolors = (0, 0, 0, 1),
          array= d_matrix,
          cmap = cm.gray,
          offsets = n_centers,
          transOffset = ax.transData,
      )
      ax.add_collection(collection_bg, autolim=True)
      ax.axis('off')
      ax.autoscale_view()
      ax.set_title(title)
      divider = make_axes_locatable(ax)
      cax = divider.append_axes("right", size="5%", pad=0.05)
      plt.colorbar(collection_bg, cax=cax)
  
      return ax
  </code></pre>
  
  <p>I've tried to make something that automatically understands the grid shape. It didn't work (and I'm not sure why). It always appear a undesired space between the hexagons</p>
  
  <p><img src="https://i.stack.imgur.com/rZm1V.png" alt="6x6"></p>
  
  <p><img src="https://i.stack.imgur.com/SniYY.png" alt="3 x 3"></p>
  
  <p><img src="https://i.stack.imgur.com/dHWLK.png" alt="11 x 3"></p>
  
  <p>Summarising: I would like to generate 3x3 or 6x6 or 10x4 (and so on) grid using hexagons with no spaces in the between for given points and setting the plot width.</p>
  
  <p>As it was asked, here is the data for the hexagons location. As you can see, it always the same pattern</p>
  
  <p><strong>3x3</strong></p>
  
  <pre><code>  {'centers': array([[ 1.5       ,  0.8660254 ],
     [ 2.5       ,  0.8660254 ],
     [ 3.5       ,  0.8660254 ],
     [ 1.        ,  1.73205081],
     [ 2.        ,  1.73205081],
     [ 3.        ,  1.73205081],
     [ 1.5       ,  2.59807621],
     [ 2.5       ,  2.59807621],
     [ 3.5       ,  2.59807621]]),
    'x': array([ 3.]),
    'y': array([ 3.])}
  </code></pre>
  
  <p><strong>6x6</strong></p>
  
  <pre><code>{'centers': array([[ 1.5       ,  0.8660254 ],
     [ 2.5       ,  0.8660254 ],
     [ 3.5       ,  0.8660254 ],
     [ 4.5       ,  0.8660254 ],
     [ 5.5       ,  0.8660254 ],
     [ 6.5       ,  0.8660254 ],
     [ 1.        ,  1.73205081],
     [ 2.        ,  1.73205081],
     [ 3.        ,  1.73205081],
     [ 4.        ,  1.73205081],
     [ 5.        ,  1.73205081],
     [ 6.        ,  1.73205081],
     [ 1.5       ,  2.59807621],
     [ 2.5       ,  2.59807621],
     [ 3.5       ,  2.59807621],
     [ 4.5       ,  2.59807621],
     [ 5.5       ,  2.59807621],
     [ 6.5       ,  2.59807621],
     [ 1.        ,  3.46410162],
     [ 2.        ,  3.46410162],
     [ 3.        ,  3.46410162],
     [ 4.        ,  3.46410162],
     [ 5.        ,  3.46410162],
     [ 6.        ,  3.46410162],
     [ 1.5       ,  4.33012702],
     [ 2.5       ,  4.33012702],
     [ 3.5       ,  4.33012702],
     [ 4.5       ,  4.33012702],
     [ 5.5       ,  4.33012702],
     [ 6.5       ,  4.33012702],
     [ 1.        ,  5.19615242],
     [ 2.        ,  5.19615242],
     [ 3.        ,  5.19615242],
     [ 4.        ,  5.19615242],
     [ 5.        ,  5.19615242],
     [ 6.        ,  5.19615242]]),
  'x': array([ 6.]),
  'y': array([ 6.])}
  </code></pre>
  
  <p><strong>11x4</strong></p>
  
  <pre><code>  {'centers': array([[  1.5       ,   0.8660254 ],
     [  2.5       ,   0.8660254 ],
     [  3.5       ,   0.8660254 ],
     [  4.5       ,   0.8660254 ],
     [  5.5       ,   0.8660254 ],
     [  6.5       ,   0.8660254 ],
     [  7.5       ,   0.8660254 ],
     [  8.5       ,   0.8660254 ],
     [  9.5       ,   0.8660254 ],
     [ 10.5       ,   0.8660254 ],
     [ 11.5       ,   0.8660254 ],
     [  1.        ,   1.73205081],
     [  2.        ,   1.73205081],
     [  3.        ,   1.73205081],
     [  4.        ,   1.73205081],
     [  5.        ,   1.73205081],
     [  6.        ,   1.73205081],
     [  7.        ,   1.73205081],
     [  8.        ,   1.73205081],
     [  9.        ,   1.73205081],
     [ 10.        ,   1.73205081],
     [ 11.        ,   1.73205081],
     [  1.5       ,   2.59807621],
     [  2.5       ,   2.59807621],
     [  3.5       ,   2.59807621],
     [  4.5       ,   2.59807621],
     [  5.5       ,   2.59807621],
     [  6.5       ,   2.59807621],
     [  7.5       ,   2.59807621],
     [  8.5       ,   2.59807621],
     [  9.5       ,   2.59807621],
     [ 10.5       ,   2.59807621],
     [ 11.5       ,   2.59807621],
     [  1.        ,   3.46410162],
     [  2.        ,   3.46410162],
     [  3.        ,   3.46410162],
     [  4.        ,   3.46410162],
     [  5.        ,   3.46410162],
     [  6.        ,   3.46410162],
     [  7.        ,   3.46410162],
     [  8.        ,   3.46410162],
     [  9.        ,   3.46410162],
     [ 10.        ,   3.46410162],
     [ 11.        ,   3.46410162]]),
    'x': array([ 11.]),
    'y': array([ 4.])}
  </code></pre>