plotting all paths of a simple random walk

Dear Matplotlib folks,

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?

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

srw.py (903 Bytes)

Dear Matplotlib folks,

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), and paths will not show up because the lines are all on top of each other.

The number of all paths looks very large to me and even without matplotlib overhead, this might soon run into problems.

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)

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)

I don’t know any answer to the matplotlib specific part

Josef

···

On Tue, Jun 21, 2011 at 8:47 AM, Paul Menzel <paulepanter@…16…> wrote:

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


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

> 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.

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

···

Am Dienstag, den 21.06.2011, 09:43 -0400 schrieb josef.pktd@...287...:

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

try_bin_random_walk.py (1.36 KB)

···

On Tue, Jun 21, 2011 at 5:25 PM, Paul Menzel <paulepanter@...16...> wrote:

Am Dienstag, den 21.06.2011, 09:43 -0400 schrieb josef.pktd@...287...:

On Tue, Jun 21, 2011 at 8:47 AM, Paul Menzel wrote:

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

>
>> > 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 am sorry. I now do understand your previous sentences correctly. Yes I
am aware that patches overlap and I only need to draw the road network.

I only see the road network in the plot

Yes that is correct and intended.

(and partially the traffic density with alpha<1).

Nice suggestion. Thank you.

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

···

Am Dienstag, den 21.06.2011, 19:17 -0400 schrieb josef.pktd@...287...:

On Tue, Jun 21, 2011 at 5:25 PM, Paul Menzel wrote:
> Am Dienstag, den 21.06.2011, 09:43 -0400 schrieb josef.pktd@...287...:
>> On Tue, Jun 21, 2011 at 8:47 AM, Paul Menzel wrote:

>> > [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