Как да начертаете замъглени точки в Matplotlib

Както се казва във въпроса, търся начин да начертая замъглени точки с помощта на Matplotlib. Не искам да начертая набор от точки и след това да приложа филтър, за да размажа цялото изображение. Вместо това, бих искал да начертая набор от точки, всяка от тях със свързано ниво на размазване.

Благодаря ви предварително.


person pceccon    schedule 29.07.2014    source източник
comment
Съжаляваме, но не е възможно с вградените функции на matplotlib.   -  person dwitvliet    schedule 29.07.2014
comment
@Banana - Всъщност е с *Agg бекенда (по подразбиране за всичко освен OSX), но ще бъде доста бавен. Разгледайте: matplotlib.org/examples/pylab_examples/demo_agg_filter.html   -  person Joe Kington    schedule 29.07.2014
comment
Всъщност има няколко различни начина за това (въпреки че Banana е прав, че трябва да сте малко креативни). Основно съображение е дали искате размерът на замъгляването да остане фиксиран в координатите на данните или координатите на дисплея. С други думи, когато увеличавате, трябва ли замъгляването да стане по-голямо в дисплея или трябва да остане със същия размер?   -  person Joe Kington    schedule 29.07.2014
comment
Здравей, @JoeKington. Първо, благодаря ви за помощта. Второ, не, засега дори не използвам интерактивния режим, просто запазвам изображенията, за да ги покажа след това в друг интерфейс, различен от този, предоставен с Matplolib. След това замъгляването ще остане фиксирано. (;   -  person pceccon    schedule 30.07.2014


Отговори (2)


Ето още една работа. Можете да показвате изображение на всяко място вместо маркер, като използвате BboxImage. По този начин можете да замъглите или манипулирате изображението по какъвто желаете начин. Този урок съдържа повече за BboxImages.

import matplotlib.pyplot as plt
from scipy import ndimage
from matplotlib.image import BboxImage
from matplotlib.transforms import Bbox, TransformedBbox
import numpy as np

# Create and save an image with just a marker in it
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.plot(0.5,0.5,'*',ms=200)
ax1.set_ylim(0,1)
ax1.set_xlim(0,1)
plt.axis('off')
fig1.savefig('marker.png')

# Read in the same marker image
marker = plt.imread('marker.png')

# New figure and data
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
x = 8*np.random.rand(10) + 1
y = 8*np.random.rand(10) + 1
sigma = np.arange(10,60,5)

# Blur the marker and image plot the blurred image at each data point. 
for xi, yi, sigmai in zip(x,y,sigma):
    markerBlur = ndimage.gaussian_filter(marker,sigmai) # Blur the marker image

    # Create an BboxImage for the blurred marker and add it to the plot. 
    bb = Bbox.from_bounds(xi,yi,1,1)  
    bb2 = TransformedBbox(bb,ax2.transData)
    bbox_image = BboxImage(bb2,
                           norm = None,
                           origin=None,
                           clip_on=False)

    bbox_image.set_data(markerBlur)
    ax2.add_artist(bbox_image)

ax2.set_xlim(0,10)
ax2.set_ylim(0,10)
plt.show()

график на замъглени маркери

person Molly    schedule 30.07.2014
comment
Доста добро решение! Не знаех за това! Благодаря ти много! - person pceccon; 01.08.2014

Когато не можете да го направите, фалшифицирайте го.

import matplotlib.pyplot as plt
import numpy as np

# some random data
x = np.random.random(100)
y = np.random.random(100)
z = np.random.random(100)

# z reflects the amount of defocus at each dot
# if z=0, the point is small (1 pt)
# if z=1, the point is large (50 pt)
# each dot is composed of different layers
fig = plt.figure()
ax = fig.add_subplot(111)
for i in np.arange(.1,1.01,.1):
    ax.scatter(x, y, s=(50*i*(z*.9+.1))**2, color=(0,0,0,.5/i/10))

Това дава:

въведете описание на изображението тук

Това в никакъв случай не е идеално, но нещо по този начин може да задоволи нуждите ви. Неща, които трябва да имате предвид:

  • размерът на точката вече е в абсолютни единици, не се мащабира (изисква повече математика за мащабиране)
  • ако искате да имате еднакво количество мастило във всяка точка, ще трябва да намалите алфа стойността за по-големи петна
  • искате ли диаметърът на размазването да отразява стойността (както тук) или зоната на размазване?
  • истинското "размазване" обикновено е Гаусово, това не е; това може да се направи, но тогава размерът и алфа мащабирането стават малко по-дълги
  • какво искате да се случи, когато замъглените точки се припокриват?
  • когато правите математика с алфа стойности и цветови стойности, помнете гама функцията на дисплея

Така че това е просто грозен фалшификат. Понякога изглеждат достатъчно добре, понякога не.

person DrV    schedule 29.07.2014