Posición de trazado / dispersión y tamaño del marcador en las mismas coordenadas

Estoy intentando mostrar mediante progtwigción varios tipos de diagtwigs en pylab. La función de dispersión de pylab muestra marcadores en diferentes coordenadas en términos de su eje, pero los tamaños de los marcadores están en términos de píxeles. Esto tiene sentido para las gráficas gráficas diarias. Sin embargo, ¡quiero dar las coordenadas y los tamaños de los marcadores en las mismas coordenadas! por ejemplo, el siguiente código muestra dos círculos en (0.0.0.0) y (0.5.0.5) con tamaños de 20 cada uno. Estos deben superponerse casi por completo, ya que el radio es mucho más grande que la distancia entre los centros. Sin embargo, no lo hacen porque los tamaños están en píxeles, mientras que las posiciones están en términos de las coordenadas del eje.

import pylab pylab.scatter([0,0.5], [0,0.5], s=20, c='b', marker='o') 

¿Hay una manera de hacer un diagtwig de dispersión (o dibujar formas, líneas, etc.) con los tamaños y las posiciones dadas en las mismas coordenadas? Estoy interesado en una salida de gráficos vectoriales (pdf, svg, etc.).

La función pylab.scatter toma un tamaño de valor basado en el tamaño en los puntos ^ 2. Este tamaño será independiente de los ejes, como lo es la naturaleza de un diagtwig de dispersión (no tiene sentido si se reduce en una región en un diagtwig de dispersión para que los puntos se hagan más grandes).

Si quiere decir dibujar círculos que tengan un tamaño determinado, debe usar el comando de círculo en pylab

 import pylab axes = pylab.axes() circle1 = pylab.Circle((0,0), radius=20, alpha=.5) circle2 = pylab.Circle((0.5,0.5), radius=20, alpha=.5) axes.add_patch(circle1) axes.add_patch(circle2) pylab.axis('scaled') pylab.show() 

Si necesitas algo con la habilidad de un diagtwig de dispersión, podrías hacer algo como

 import pylab import matplotlib def my_circle_scatter(axes, x_array, y_array, radius=0.5, **kwargs): for x, y in zip(x_array, y_array): circle = pylab.Circle((x,y), radius=radius, **kwargs) axes.add_patch(circle) return True def my_square_scatter(axes, x_array, y_array, size=0.5, **kwargs): size = float(size) for x, y in zip(x_array, y_array): square = pylab.Rectangle((x-size/2,y-size/2), size, size, **kwargs) axes.add_patch(square) return True def my_polygon_scatter(axes, x_array, y_array, resolution=5, radius=0.5, **kwargs): ''' resolution is number of sides of polygon ''' for x, y in zip(x_array, y_array): polygon = matplotlib.patches.CirclePolygon((x,y), radius=radius, resolution=resolution, **kwargs) axes.add_patch(polygon) return True axes=pylab.axes() my_circle_scatter(axes, [0,0.5], [0,0.5], radius=2, alpha=.5, color='b') my_square_scatter(axes, [-3,-4,2,3], [1,-3,0,3], size=.5, alpha=.5, color='r') my_polygon_scatter(axes, [-1,-2,3], [-3,0,3], radius=.5, resolution=3, alpha=.5, color='g') my_polygon_scatter(axes, [4,1.5,3], [2,-1,-3], radius=.5, resolution=5, alpha=.5, color='k') pylab.axis('scaled') pylab.axis([-5,5,-5,5]) pylab.show() 

Vea http://matplotlib.sourceforge.net/api/artist_api.html#module-matplotlib.patches para otros objetos dibujables.

Salida de muestra del primer fragmento: círculos de matplotlib

Salida de muestra del segundo fragmento: gráfico de dispersión matplotlib

EDITAR para Griff: si desea manejar un radio diferente para cada punto, puede hacer algo directo como:

 def my_circle_scatter_radii(axes, x_array, y_array, radii_array, **kwargs): for (x, y, r) in zip(x_array, y_array, radii_array): circle = pylab.Circle((x,y), radius=r, **kwargs) axes.add_patch(circle) return True 

La lógica para manejar ambos casos a la vez es también sencilla (por ejemplo, verifique si su radii_array es un int / float y si es así, conviértalo en una matriz).

La colección de parches es una mejor opción si realmente desea que sea similar a plt.scatter . Supongamos que desea trazar una dispersión de círculos con un radio determinado en la unidad de datos, puede echar un vistazo a esta publicación que proporciona una función bien ajustada llamada circles .

Si desea utilizar otros marcadores como cuadrado o polígono, puede volver a escribir esta función con los parches correspondientes como se dijo en la respuesta de dr jimbob.

Aquí un ejemplo

 from pylab import * figure(figsize=(6,4)) ax = subplot(aspect='equal') #plot a set of circle a = arange(11) circles(a, a, s=a*0.2, c=a, alpha=0.5, ec='none') colorbar() #plot a circle (the lower-right one) circles(1, 0, s=0.4, c='r', ls='--', lw=5, fc='none', transform=ax.transAxes) xlim(0,10) ylim(0,10) 

introduzca la descripción de la imagen aquí