Agora vou mostrar como interagir com gráficos. Isso na verdade é bastante complicado, requer um entendimento forte de orientação a objetos(OO). Nesse exemplo eu tentei evitar OO, justamente porque não estou tão familiarizado com isso.
A proposta é: dado um conjunto de pontos como selecionar somente aqueles dentro de um polígono definido pelo usuário interagindo com o gráfico? A solução é o seguinte a seguir. Como de costume, precisa o NumPy, MatPlotLib e PyLab.
O programa funciona da seguinte maneira. Enquanto você vai com o mouse no ponto onde quer definir um dos vértices do polígono e aperta alguma tecla do teclado que não seja a tecla 'q', um ponto será marcado. Ao apertar 'q' você sai do programa e os pontos dentro do polígono são marcados pela cor vermelha.
#!/usr/bin/python
from pylab import *
import numpy as np
import matplotlib.nxutils as nx
poly=np.zeros([100,2]) #limits the number of vertices to 100 (how to ovecome this?)
i = int(0) #not very python-ish
x = np.random.rand(1000)
y = np.random.rand(1000)
f = np.array([x,y])
f = np.transpose(f)
def click(event):
global poly,f,i,g
tb = get_current_fig_manager().toolbar
if event.key != 'q' and event.inaxes and tb.mode == '':
poly[i,0],poly[i,1] = event.xdata,event.ydata
plot(poly[0:i+1,0],poly[0:i+1,1],'rs-')
draw()
i += 1
else:
poly[i,0],poly[i,1] = poly[0,0],poly[0,1]
poly = np.resize(poly,(i+1,2))
inside = nx.points_inside_poly(f[:,0:2], poly)
g = f[nonzero(inside),] #this adds an extra dimension to the array (why?!)
plot(g[:,:,0],g[:,:,1],'r.',markersize=6)
return g
fig = figure()
ax = fig.add_subplot(111,autoscale_on=True)
ax.plot(f[:,0],f[:,1],'k.',markersize=4)
#connects python with the display
cid = connect('key_press_event', click)
show()
disconnect(cid)
Felizmente, nesse exemplo não precisa baixar nada. Basta copiar, colar e rodar. Ah sim, o highlight da sintaxe python foi feito nesse site.
Ia escrever outro post sobre um resolvedor de simulação 3 corpos em python, mas já ta no meu site e eu cansei do blogspot, queria mesmo é o wordpress. Nesse exemplo tem até instruções pra criar uma animação.
PS.: caiu fora do post as linhas muito longas, não to com saco pra arrumar agora
No comments:
Post a Comment