<｜begin▁of▁sentence｜>### Instruction:
Given a graph with vertices connected by directed edges, how can you use the CairoArrowEdgeDrawer's draw_loop_edge function in igraph to draw a loop edge at a specified vertex, enhancing the visualization to highlight self-referential relationships? Assume you have a small graph where such a loop should be visually represented at the first vertex.
### Response:
from igraph import Graph, plot
from igraph.drawing.edge import CairoArrowEdgeDrawer

def draw_loop_edge(graph, vertex_id, loop_size=20, filename='graph_with_loop.png'):
    layout = graph.layout()
    visual_style = {'margin': 20}
    surface, ctx = plot(graph, layout=layout, target=None, **visual_style)
    drawer = CairoArrowEdgeDrawer(ctx)
    center = layout[vertex_id]
    drawer.draw_loop_edge(center, loop_size, loop_size)
    surface.write_to_png(filename)

# Example usage:
g = Graph(edges=[(0, 1), (1, 2), (2, 0)])
draw_loop_edge(g, 0, loop_size=30)
<|EOT|>
