xlabel outside example python matplotlib

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:

  1. Vea los círculos en una relación de aspecto natural.

  2. 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