class_docstr: Assign coordinates to the nodes along a circle.
  
  The points on the circle can be spaced either uniformly or randomly.
  
  Accepts an edges argument for consistency with other layout algorithms,
  but ignores it.
class_docstr_tok: ["Assign","coordinates","to","the","nodes","along","a","circle",".","The","points","on","the","circle","can","be","spaced","either","uniformly","or","randomly",".","Accepts","an","edges","argument","for","consistency","with","other","layout","algorithms",",","but","ignores","it","."]
code: def __call__(self, nodes, edges=None, **params):
      p = param.ParamOverrides(self, params)
  
      np.random.seed(p.seed)
  
      r = 0.5  # radius
      x0, y0 = 0.5, 0.5  # center of unit circle
      circumference = 2 * np.pi
  
      df = nodes.copy()
  
      if p.uniform:
          thetas = np.arange(
              circumference, step=circumference / len(df)
          )
      else:
          thetas = (
              np.asarray(np.random.random((len(df),))) * circumference
          )
  
      df[p.x] = x0 + r * np.cos(thetas)
      df[p.y] = y0 + r * np.sin(thetas)
  
      return df
  
file_path: datashader/datashader/layout.py
imports: from __future__ import annotations
  import numpy
  import param
  import scipy.sparse
label_desc: Use image node_id 1 for calling the circular_layout obj's underlying member method code with example usage: obj.__call__(nodes, edges) and returns: df