On Tue, Jun 21, 2011 at 5:25 PM, Paul Menzel
<paulepan...@users.sourceforge.net> wrote:
> Am Dienstag, den 21.06.2011, 09:43 -0400 schrieb josef.p...@gmail.com:
>> On Tue, Jun 21, 2011 at 8:47 AM, Paul Menzel wrote:
>
>> > I want to plot all paths of a simple random walk and wrote the following
>> > recursive program based on the Path tutorial [1].
>> >
>> > import matplotlib.pyplot as plt
>> > from matplotlib.path import Path
>> > import matplotlib.patches as patches
>> >
>> > def draw(a, b, c, d):
>> > verts = [
>> > (a, b),
>> > (c, d),
>> > (0, 0),
>> > ]
>> >
>> > codes = [
>> > Path.MOVETO,
>> > Path.LINETO,
>> > Path.CLOSEPOLY
>> > ]
>> >
>> > path = Path(verts, codes)
>> > patch = patches.PathPatch(path)
>> > ax.add_patch(patch)
>> >
>> > def irrpfad(a, b):
>> > if a < length:
>> > draw(a, b, a + 1., b + 1.)
>> > draw(a, b, a + 1., b - 1.)
>> > irrpfad(a + 1, b + 1)
>> > irrpfad(a + 1, b - 1)
>> >
>> >
>> > length = 5 # 20 not possible to run
>> >
>> > fig = plt.figure()
>> > ax = fig.add_subplot(111)
>> > irrpfad(0, 0)
>> > ax.set_xlim(0,length)
>> > ax.set_ylim(-length,length)
>> > plt.show()
>> >
>> > Using 20 for `length` stalls my system and the memory used seems to be
>> > over 1 GB. I guess this is what you guess using something recursive.
>> > What optimizations are there. I am drawing each line after another so
>> > probably too many separate paths instead of one. Being a Python noob I
>> > do not know if I can append something to a path. Looking at the API
>> > documentation [2] I did not see such a method.
>> >
>> > Being also new to Matplotlib I may have also overlooked more appropriate
>> > methods/classes.
>> >
>> > So to summarize my message,
>> >
>> > 1. How can I add lines to a path?
>> > 2. Are recursive functions bad in Python/Matplotlib?
>> > 3. Are there better approaches?
>>
>> I'm not sure what you are trying to show, but my impression is that you are
>> just producing the grid between integers (move up,down),
>
> Yeah, that is about right [1].
>
>> and paths will not show up because the lines are all on top of each other.
>
> That is not true. My program displays everything correctly when using
> for example `length = 5`.
>
>> The number of all paths looks very large to me and even without matplotlib
>> overhead, this might soon run into problems.
>
> That is what thought too.
>
>> for example;
>> for length= 15; I get 65534 moves in the random walks, but only 240 unique
>> moves
>> for length= 20; I get 2097150 moves in the random walks, but only 420 unique
>> moves
>> plotting only unique moves is fast (count of moves might work to color the
>> amount of traffic on each move)
>
> I am sorry, I think that in my program no section is drawn more than
> once.
each append below corresponds to one call to your draw function
Do you want to draw all possible routes, or the road network? I only
see the road network in the plot (and partially the traffic density
with alpha<1).
Josef
>
>> rw_moves = []
>> def irrpfad2(a, b):
>> if a < length:
>> rw_moves.append((a, b, a + 1, b + 1))
>> rw_moves.append((a, b, a + 1, b - 1))
>> irrpfad2(a + 1, b + 1)
>> irrpfad2(a + 1, b - 1)
>>
>> length = 20 # 20 not possible to run
>> irrpfad2(0, 0)
>
> Thank you for the example, but now I need to somehow also add the codes
> to be able to pass this to Path.
>
>> I don't know any answer to the matplotlib specific part
>
> Thank you for your other answers.
>
>> > Please find the source also attached. I am using python-matplotlib
>> > 1.0.1-2 from Debian Sid/unstable.
>
>
> Thanks,
>
> Paul
>
>
>> > [1] http://matplotlib.sourceforge.net/users/path_tutorial.html
>> > [2]
>> > http://matplotlib.sourceforge.net/api/path_api.html#matplotlib.path.Path
> [3] https://secure.wikimedia.org/wikipedia/en/wiki/Random_walk
>
> ------------------------------------------------------------------------------
> EditLive Enterprise is the world's most technically advanced content
> authoring tool. Experience the power of Track Changes, Inline Image
> Editing and ensure content is compliant with Accessibility Checking.
> http://p.sf.net/sfu/ephox-dev2dev
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
>
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
def draw(a, b, c, d):
verts = [
(a, b),
(c, d),
(0, 0),
]
codes = [
Path.MOVETO,
Path.LINETO,
Path.CLOSEPOLY
]
path = Path(verts, codes)
patch = patches.PathPatch(path, lw=1)#2, alpha=0.2)
ax.add_patch(patch)
def irrpfad(a, b):
if a < length:
draw(a, b, a + 1., b + 1.)
draw(a, b, a + 1., b - 1.)
irrpfad(a + 1, b + 1)
irrpfad(a + 1, b - 1)
rw_moves = []
def irrpfad2(a, b):
if a < length:
rw_moves.append((a, b, a + 1, b + 1))
rw_moves.append((a, b, a + 1, b - 1))
irrpfad2(a + 1, b + 1)
irrpfad2(a + 1, b - 1)
length = 6 # 20 not possible to run
irrpfad2(0, 0)
print 'all moves', len(rw_moves)
print 'unique moves', len(set(rw_moves))
fig = plt.figure()
ax = fig.add_subplot(111)
#irrpfad(0, 0)
for m in rw_moves:
draw(*m)
ax.set_xlim(0,length)
ax.set_ylim(-length,length)
ax.set_title('all path segments')
fig = plt.figure()
ax = fig.add_subplot(111)
#irrpfad(0, 0)
for m in set(rw_moves):
draw(*m)
ax.set_xlim(0,length)
ax.set_ylim(-length,length)
ax.set_title('unique path segments')
plt.show()
------------------------------------------------------------------------------
EditLive Enterprise is the world's most technically advanced content
authoring tool. Experience the power of Track Changes, Inline Image
Editing and ensure content is compliant with Accessibility Checking.
http://p.sf.net/sfu/ephox-dev2dev
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users