python - outside - matplotlib title position
trazar un cĂrculo con pyplot (6)
sorprendentemente, no encontré una descripción directa sobre cómo dibujar un círculo con matplotlib.pyplot (por favor, no pylab) tomando como centro de entrada (x, y) y radio r. Probé algunas variantes de esto:
import matplotlib.pyplot as plt
circle=plt.Circle((0,0),2)
# here must be something like circle.plot() or not?
plt.show()
... pero aun así no funcionó.
Debes agregarlo a un eje. Un Circle
es una subclase de un Artist
, y un axes
tiene un método add_artist
.
Aquí hay un ejemplo de hacer esto:
import matplotlib.pyplot as plt
circle1 = plt.Circle((0, 0), 0.2, color=''r'')
circle2 = plt.Circle((0.5, 0.5), 0.2, color=''blue'')
circle3 = plt.Circle((1, 1), 0.2, color=''g'', clip_on=False)
fig, ax = plt.subplots() # note we must use plt.subplots, not plt.subplot
# (or if you have an existing figure)
# fig = plt.gcf()
# ax = fig.gca()
ax.add_artist(circle1)
ax.add_artist(circle2)
ax.add_artist(circle3)
fig.savefig(''plotcircles.png'')
Esto da como resultado la siguiente figura:
El primer círculo está en el origen, pero por defecto clip_on
es True
, por lo que el círculo se recorta cuando se extiende más allá de los axes
. El tercer círculo (verde) muestra lo que sucede cuando no se sujeta el Artist
. Se extiende más allá de los ejes (pero no más allá de la figura, es decir, el tamaño de la figura no se ajusta automáticamente para trazar todos sus artistas).
Las unidades para x, y y radio corresponden a unidades de datos por defecto. En este caso, no fig.gca()
nada en mis ejes ( fig.gca()
devuelve los ejes actuales), y como los límites nunca se han establecido, tienen un valor predeterminado de xey de 0 a 1.
Aquí hay una continuación del ejemplo, que muestra cómo las unidades importan:
circle1 = plt.Circle((0, 0), 2, color=''r'')
# now make a circle with no fill, which is good for hi-lighting key results
circle2 = plt.Circle((5, 5), 0.5, color=''b'', fill=False)
circle3 = plt.Circle((10, 10), 2, color=''g'', clip_on=False)
ax = plt.gca()
ax.cla() # clear things for fresh plot
# change default range so that new circles will work
ax.set_xlim((0, 10))
ax.set_ylim((0, 10))
# some data
ax.plot(range(11), ''o'', color=''black'')
# key data point that we are encircling
ax.plot((5), (5), ''o'', color=''y'')
ax.add_artist(circle1)
ax.add_artist(circle2)
ax.add_artist(circle3)
fig.savefig(''plotcircles2.png'')
lo que resulta en:
Puedes ver cómo configuro el relleno del 2º círculo en False
, lo que es útil para rodear los resultados clave (como mi punto de datos amarillo).
Extendiendo la respuesta aceptada para un uso común. En particular:
Vea los círculos en una relación de aspecto natural.
Extienda automáticamente los límites de los ejes para incluir los círculos recién trazados.
Ejemplo autónomo:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.add_patch(plt.Circle((0, 0), 0.2, color=''r'', alpha=0.5))
ax.add_patch(plt.Circle((1, 1), 0.5, color=''#00ffff'', alpha=0.5))
ax.add_artist(plt.Circle((1, 0), 0.5, color=''#000033'', alpha=0.5))
#Use adjustable=''box-forced'' to make the plot area square-shaped as well.
ax.set_aspect(''equal'', adjustable=''datalim'')
ax.plot() #Causes an autoscale update.
plt.show()
Tenga en cuenta la diferencia entre ax.add_patch(..)
y ax.add_artist(..)
: de los dos, solo el primero hace que la maquinaria de autoescalado tenga en cuenta el círculo (referencia: discussion ), por lo que después de ejecutar el código anterior obtenemos:
Ver también: documentación set_aspect(..)
.
Si desea trazar un conjunto de círculos, es posible que desee ver esta publicación o esta esencia (un poco más reciente). La publicación ofrecía una función llamada circles
.
Los circles
funciones funcionan como scatter
, pero los tamaños de los círculos representados están en la unidad de datos.
Aquí hay un ejemplo:
from pylab import *
figure(figsize=(8,8))
ax=subplot(aspect=''equal'')
#plot one circle (the biggest one on bottom-right)
circles(1, 0, 0.5, ''r'', alpha=0.2, lw=5, edgecolor=''b'', transform=ax.transAxes)
#plot a set of circles (circles in diagonal)
a=arange(11)
out = circles(a, a, a*0.2, c=a, alpha=0.5, edgecolor=''none'')
colorbar(out)
xlim(0,10)
ylim(0,10)
Si intenta que el "círculo" mantenga una relación de aspecto visual de 1, independientemente de las coordenadas de datos, podría usar el método scatter (). matplotlib.org/1.3.1/api/…
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
r = [100, 80, 60, 40, 20] # in points, not data units
fig, ax = plt.subplots(1, 1)
ax.scatter(x, y, s=r)
fig.show()
#!/usr/bin/python
import matplotlib.pyplot as plt
import numpy as np
def xy(r,phi):
return r*np.cos(phi), r*np.sin(phi)
fig = plt.figure()
ax = fig.add_subplot(111,aspect=''equal'')
phis=np.arange(0,6.28,0.01)
r =1.
ax.plot( *xy(r,phis), c=''r'',ls=''-'' )
plt.show()
O, si lo prefiere, mire la path
s, http://matplotlib.sourceforge.net/users/path_tutorial.html
import matplotlib.pyplot as plt
circle1=plt.Circle((0,0),.2,color=''r'')
plt.gcf().gca().add_artist(circle1)
Una versión condensada rápida de la respuesta aceptada, que se ajustaba a mi necesidad de insertar rápidamente un círculo en una trama existente. Consulte la respuesta aceptada y otras respuestas para comprender los detalles.
Por cierto:
- gcf () significa obtener la figura actual
- gca () significa obtener eje actual