class_docstr: Matplotlib-specific abstract edge drawer object.
docstr: Draws a loop edge.
  
  The default implementation draws a small circle.
  
  @param edge: the edge to be drawn. Visual properties of the edge
    are defined by the attributes of this object.
  @param vertex: the vertex to which the edge is attached. Visual
    properties are given again as attributes.
code: def draw_loop_edge(self, edge, vertex):
      """Draws a loop edge.
  
      The default implementation draws a small circle.
  
      @param edge: the edge to be drawn. Visual properties of the edge
        are defined by the attributes of this object.
      @param vertex: the vertex to which the edge is attached. Visual
        properties are given again as attributes.
      """
      fig = self.context
      radius = vertex.size * 1.5
      center_x = vertex.position[0] + cos(pi / 4) * radius / 2.0
      center_y = vertex.position[1] - sin(pi / 4) * radius / 2.0
      stroke = {
          "type": "path",
          "path": format_arc(
              (center_x, center_y),
              radius / 2.0,
              radius / 2.0,
              theta1=0,
              theta2=360.0,
          ),
          "line_color": edge.color,
          "line_width": edge.width,
      }
      fig.add_shape(stroke)
  
file_path: python-igraph/src/igraph/drawing/plotly/edge.py
imports: from math import atan2, cos, pi, sin
  from igraph.drawing.baseclasses import AbstractEdgeDrawer
  from igraph.drawing.metamagic import AttributeCollectorBase
  from igraph.drawing.plotly.utils import find_plotly, format_path_step, format_arc, format_rgba
  from igraph.drawing.utils import Point, euclidean_distance, get_bezier_control_points_for_curved_edge, intersect_bezier_curve_and_circle
label_desc: Use image node_id 4 for calling the PlotlyEdgeDrawer obj's underlying member method code with example usage: obj.draw_loop_edge(edge, vertex) without return types