Elementos auxiliares (Círculo)
O patch disponível para inserir círculos é o Circle. É necessário passar apenas o parâmetro xy para desenhar esta forma, que recebe uma tuple com dois números, que são as coordenadas do centro do círculo. Por exemplo, para inserir um círculo em x = 2 e y = 2:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.gca().add_patch(patches.Circle(xy=(2,2)))
plt.show()
Figura 1 - Gráfico de dispersão com um círculo inserido.

Observe que o círculo não ficou perfeito, o que ocorreu devido ao número de pixels utilizados em um eixo, comparado ao outro eixo. Neste exemplo, temos que os valores de x e y tem o mesmo range. Entretanto, a figura esta sendo criada mais larga (eixo x) do que alta (eixo y), e.g. figsize=(8,6). Dessa forma, existe um incompatibilidade entre os pixels do eixo x e do eixo y, o que faz com que o círculo fique visualmente distorcido, e seja renderizado de forma ovalada.
Para contornar este problema, temos algumas opções. A primeira delas, é utilizar uma figura de altura e largura iguais. Por exemplo:
plt.figure(figsize=(6,6))
plt.scatter(x,y)
plt.gca().add_patch(patches.Circle(xy=(2,2)))
plt.show()
Figura 2 - Gráfico de dispersão com um círculo inserido.

Uma outra alternativa, é adicionar o método plt.axis() (que será estudado com mais detalhes um pouco a frente) e passar a str "equal" para este método, o que vai forçar a renderização de forma correta:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.gca().add_patch(patches.Circle(xy=(2,2)))
plt.axis("equal")
plt.show()
Figura 3 - Gráfico de dispersão com um círculo inserido.

Mas observe que agora a faixa do eixo x é maior do que a faixa do eixo y, sendo este o resultado da aplicação do plt.axis("equal").
A outra opção é desenhar uma elipse com formato de círculo (veremos em seguida como fazer).
Raio do círculo
Para determinar qual o raio o círculo terá, basta passar um número (int ou float) para o parâmetro radius. Por padrão, radius=5. Por exemplo, para desenhar um círculo de raio 1:
plt.figure(figsize=(8,6))
plt.scatter(x,y)
plt.gca().add_patch(patches.Circle(xy=(2,2), radius=1))
plt.axis("equal")
plt.show()
Figura 4 - Gráfico de dispersão com um círculo inserido com raio igual a 1.

Edições
O patches.Circle aceita uma série de parâmetros para a sua edição, sendo possível alterar a cor de preenchimento (color ou facecolor), remover o preenchimento (fill), inserir linhas (linestyle, linewidth, edgecolor), inserir estilos de preenchimento (hatch), adicionar transparência (alpha), determinar a ordem de plotagem (zorder), inserir nome para legenda (label), entre outros, de forma muito similar ao que temos feito até aqui.
Você encontra maiores detalhes na documentação.