2012-06-09 4 views
6

Я хотел бы создать эллипсы в matplotlib с цветом заливки, который имеет значение альфа (непрозрачность), которое зависит от радиуса;matplotlib цвет градиента в патчах?

например, двумерный гауссовский.

Есть ли способ сделать это?

Можно создавать прямоугольные участки с градиентами цветов достаточно легко (как Gradient facecolor matplotlib bar plot и this), но я не могу понять, как сделать то же самое для кругов/эллипсов.

ответ

7

Здесь функция Пример использования идеи от должности Алекса

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-') 

А вот что вы получаете, когда вы запускаете

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

Мне нравится подход - я сам это рассмотрел, но отклонил его по нескольким причинам. 1. Он не работает на логарифмических графиках (не для того, чтобы патчи работали хорошо, но они стараются) 2. Для этого требуется предварительное знание границ сюжета (хотя это можно обойти) 3. Это довольно медленно. Тем не менее, на данный момент, я справлюсь с этим. – keflavich

+0

Я предполагаю, что происхождение imshow должно быть в левом нижнем углу: 'plt.imshow (im.T, cmap = cmap, extent = xr + yr, origin =" lower ")'. – ImportanceOfBeingErnest

6

Я не думаю, что matplotlib в настоящее время поддерживает градиентные заливки для патчей - см. this email.

john> Здравствуйте, Я пытаюсь установить панель (исправленную серию прямоугольников) с шаблоном заполнения вместо сплошного цвета. Есть ли простой способ сделать это в matplotlib?
john> Я думаю о чем-то вроде Qt QBrush, который имеет крест, вертикальные, плотные и т. Д. Рисунки.

В настоящее время поддержки нет - было бы не слишком сложно добавить для бэкэндов, поддерживающих подобные вещи. В принципе, нам нужно , чтобы указать API для него, и добавить поддержку для бэкэндов. Я был , желая добавить заливки градиента для патчей (например, многоугольников, прямоугольников) , и было бы хорошо сделать оба сразу.


Вместо того, чтобы использовать патчи можно создать сетку, вычислить цвета с функцией затем используйте imshow с интерполяцией:

# 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() 

Это приведет к следующему (игнорировать клетчатый фон) :

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

+0

, а затем положить белую маску г-Intermediate с прозрачными участками, где вы хотите маркеров, чтобы получить что-то большее, как градиентные патчи на простом фоне. – cphlewis

Смежные вопросы