surpreendentemente, não encontrei uma descrição direta sobre como desenhar um círculo com o matplotlib.pyplot (por favor, sem o pylab) tomando como centro de entrada (x, y) e raio r. Eu tentei algumas variantes disso:
import matplotlib.pyplot as plt
circle=plt.Circle((0,0),2)
# here must be something like circle.plot() or not?
plt.show()
... mas ainda não funcionou.
python
matplotlib
Max Li
fonte
fonte
plt.Circle(..)
direciona paramatplotlib.patches.Circle()
. Portanto, uma solução sem pyplot seriacircle = matplotlib.patches.Circle(..); axes.add_artist(circle)
.Respostas:
Você precisa adicioná-lo aos eixos. A
Circle
é uma subclasse de anArtist
e anaxes
possui umadd_artist
métodoAqui está um exemplo de como fazer isso:
Isso resulta na seguinte figura:
O primeiro círculo está na origem, mas por padrão
clip_on
estáTrue
, então o círculo é cortado sempre que se estende além doaxes
. O terceiro círculo (verde) mostra o que acontece quando você não recorta oArtist
. Ela se estende além dos eixos (mas não além da figura, ou seja, o tamanho da figura não é ajustado automaticamente para plotar todos os seus artistas).As unidades para x, ye raio correspondem às unidades de dados por padrão. Nesse caso, eu não plotei nada nos meus eixos (
fig.gca()
retorna os eixos atuais) e, como os limites nunca foram definidos, eles assumem o padrão de x e y de 0 a 1.Aqui está uma continuação do exemplo, mostrando como as unidades são importantes:
o que resulta em:
Você pode ver como eu defino o preenchimento do segundo círculo
False
, o que é útil para envolver os principais resultados (como meu ponto de dados amarelo).fonte
matplotlib.pyplot.Circle == matplotlib.patches.Circle
avaliaTrue
, então provavelmente são aliases.Uma versão resumida rápida da resposta aceita, para conectar rapidamente um círculo a um gráfico existente. Consulte a resposta aceita e outras respostas para entender os detalhes.
A propósito:
gcf()
significa Obter figura atualgca()
significa obter eixo atualfonte
dir(fig)
mostra mais de 30 métodos 'get', masgca
não temget_current_axis
alias. Essas respostas são maravilhosas.plt.gca()
, em vez deplt.gcf().gca()
Se você deseja plotar um conjunto de círculos, pode ver esta postagem ou essa essência (um pouco mais recente). O cargo oferecido uma função chamada
circles
.A função
circles
funciona assimscatter
, mas os tamanhos dos círculos plotados estão na unidade de dados.Aqui está um exemplo:
fonte
transform=ax.transAxes
faz?mplleaflet
? Se sim, você poderia dar um exemplo, por favor?matplotlib
, acho que deve ser compatível,mplleaflet
embora eu nunca tenha tentado.Ou, se preferir, consulte
path
s, http://matplotlib.sourceforge.net/users/path_tutorial.htmlfonte
Se você deseja que o "círculo" mantenha uma proporção visual de 1, independentemente das coordenadas dos dados, você pode usar o método scatter (). http://matplotlib.org/1.3.1/api/pyplot_api.html#matplotlib.pyplot.scatter
fonte
Estendendo a resposta aceita para um caso de uso comum. Em particular:
Veja os círculos em uma proporção natural.
Estenda automaticamente os limites dos eixos para incluir os círculos recentemente plotados.
Exemplo independente:
Observe a diferença entre
ax.add_patch(..)
eax.add_artist(..)
: dos dois, apenas o primeiro faz com que o mecanismo de autoescalonamento leve em consideração o círculo (referência: discussão ); portanto, depois de executar o código acima, obtemos:Veja também:
set_aspect(..)
documentação .fonte
fig, ax = plt.subplots()
, caso contrário, você terá duas janelas (uma está em branco).Vejo gráficos com o uso de (.circle), mas com base no que você pode querer fazer, também pode tentar isso:
fonte
Olá, eu escrevi um código para desenhar um círculo. Isso ajudará a desenhar todos os tipos de círculos. A imagem mostra o círculo com raio 1 e centro em 0,0 O centro e o raio podem ser editados de qualquer escolha.
Boa sorte
fonte
Da mesma forma que a plotagem de dispersão, você também pode usar a plotagem normal com estilo de linha de círculo. Usando o
markersize
parâmetro, você pode ajustar o raio de um círculo:fonte