2012-06-09 32 views

Respuesta

7

Aquí es función ejemplo usando la idea del post de Alex

import matplotlib.pyplot as plt,numpy as np 

def gauplot(centers, radiuses, xr=None, yr=None): 
     nx, ny = 1000.,1000. 
     xgrid, ygrid = np.mgrid[xr[0]:xr[1]:(xr[1]-xr[0])/nx,yr[0]:yr[1]:(yr[1]-yr[0])/ny] 
     im = xgrid*0 + np.nan 
     xs = np.array([np.nan]) 
     ys = np.array([np.nan]) 
     fis = np.concatenate((np.linspace(-np.pi,np.pi,100), [np.nan])) 
     cmap = plt.cm.gray 
     cmap.set_bad('white') 
     thresh = 3 
     for curcen,currad in zip(centers,radiuses): 
       curim=(((xgrid-curcen[0])**2+(ygrid-curcen[1])**2)**.5)/currad*thresh 
       im[curim<thresh]=np.exp(-.5*curim**2)[curim<thresh] 
       xs = np.append(xs, curcen[0] + currad * np.cos(fis)) 
       ys = np.append(ys, curcen[1] + currad * np.sin(fis)) 
     plt.imshow(im.T, cmap=cmap, extent=xr+yr) 
     plt.plot(xs, ys, 'r-') 

Y aquí es lo que se obtiene cuando se ejecuta

gauplot([(0,0), (2,3), (5,1), (6, 7), (6.1, 6.1)], [.3,. 4, .5, 1, .4], [-1,10], [-1,10]) 
      #   centers of circles   # radii of circles# 

plot

+0

Me gusta el enfoque, lo había considerado yo mismo, pero lo rechacé por algunas razones. 1. No funciona en parcelas de registro y registro (no es que los parches funcionen bien, pero lo intentan) 2. Requiere conocimiento previo de los límites de la parcela (aunque esto se puede solucionar) 3. Es bastante lento. Aún así, por el momento, rodaré con eso. – keflavich

+0

Supongo que el origen del imshow debe estar en la esquina inferior izquierda, 'plt.imshow (im.T, cmap = cmap, extent = xr + yr, origin =" lower ")'. – ImportanceOfBeingErnest

6

No creo que matplotlib actualmente admita rellenos de degradado para parches - consulte this email.

john> Hola, estoy tratando de establecer una barra (una serie de rectángulos parcheados) con un patrón de relleno en lugar de solo un color sólido. ¿Hay alguna manera fácil de hacer esto en matplotlib?
john> Estoy pensando en algo así como Qt's QBrush que tiene patrones cruzados, verticales, densos, etc.

Actualmente no hay soporte para esto - no sería demasiado difícil agregar para los servidores que soportan este tipo de cosas. Básicamente, necesitamos para especificar la API para él y agregar soporte a los servidores. He estado queriendo agregar rellenos de degradado para parches (por ejemplo, polígonos, rectángulos) y sería bueno hacer ambas cosas a la vez.


En lugar de utilizar los parches se puede crear una malla, el cálculo de los colores con una función a continuación, utilizar imshow con interpolación:

# Taken from http://matplotlib.sourceforge.net/examples/pylab_examples/layer_images.html 

def func3(x,y): 
    return (1- x/2 + x**5 + y**3)*exp(-x**2-y**2) 

# make these smaller to increase the resolution 
dx, dy = 0.05, 0.05 

x = arange(-3.0, 3.0, dx) 
y = arange(-3.0, 3.0, dy) 
X,Y = meshgrid(x, y) 

xmin, xmax, ymin, ymax = amin(x), amax(x), amin(y), amax(y) 
extent = xmin, xmax, ymin, ymax 

fig = plt.figure(frameon=False) 

Z2 = func3(X, Y) 

im2 = imshow(Z2, cmap=cm.jet, alpha=.9, interpolation='bilinear', extent=extent) 

show() 

Esto dará lugar a la siguiente (ignorar el fondo a cuadros) :

http://matplotlib.sourceforge.net/_images/layer_images.png

+0

y luego poner una máscara blanca z-intermedio con parches transparentes donde desea que el marcadores, para obtener algo más como parches de degradado en un fondo plano. – cphlewis

Cuestiones relacionadas